From 1aad972755429047167511ac4e790d4920f42631 Mon Sep 17 00:00:00 2001 From: isaac-hammes Date: Fri, 21 Apr 2023 06:49:16 -0700 Subject: [PATCH] (RE-15162) Update Redis gem to version 5.0. --- Gemfile.lock | 19 +++++---- lib/vmpooler.rb | 12 ++++-- lib/vmpooler/pool_manager.rb | 79 +++++++++++++++++++----------------- vmpooler.gemspec | 4 +- 4 files changed, 62 insertions(+), 52 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7b0c4d7..0aef23e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,7 +3,7 @@ PATH specs: vmpooler (3.1.0) concurrent-ruby (~> 1.1) - connection_pool (~> 2.2) + connection_pool (~> 2.4) deep_merge (~> 1.2) net-ldap (~> 0.16) opentelemetry-exporter-jaeger (= 0.22.0) @@ -18,7 +18,7 @@ PATH puma (>= 5.0.4, < 7) rack (>= 2.2, < 4.0) rake (~> 13.0) - redis (~> 4.1) + redis (~> 5.0) sinatra (>= 2, < 4) spicy-proton (~> 2.1) statsd-ruby (~> 1.4) @@ -114,19 +114,22 @@ GEM rack (>= 1.3) rainbow (3.1.1) rake (13.0.6) - redis (4.8.1) + redis (5.0.6) + redis-client (>= 0.9.0) + redis-client (0.14.1) + connection_pool regexp_parser (2.8.0) rexml (3.2.5) rspec (3.12.0) rspec-core (~> 3.12.0) rspec-expectations (~> 3.12.0) rspec-mocks (~> 3.12.0) - rspec-core (3.12.1) + rspec-core (3.12.2) rspec-support (~> 3.12.0) - rspec-expectations (3.12.2) + rspec-expectations (3.12.3) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.12.0) - rspec-mocks (3.12.3) + rspec-mocks (3.12.5) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.12.0) rspec-support (3.12.0) @@ -169,9 +172,7 @@ GEM rspec (~> 3) PLATFORMS - universal-java-1.8 universal-java-11 - x86_64-linux DEPENDENCIES climate_control (>= 0.2.0) @@ -186,4 +187,4 @@ DEPENDENCIES yarjuf (>= 2.0) BUNDLED WITH - 2.3.18 + 2.4.12 diff --git a/lib/vmpooler.rb b/lib/vmpooler.rb index 54c4ffc..02a6a85 100644 --- a/lib/vmpooler.rb +++ b/lib/vmpooler.rb @@ -103,7 +103,7 @@ module Vmpooler parsed_config[:redis]['data_ttl'] = string_to_int(ENV['REDIS_DATA_TTL']) || parsed_config[:redis]['data_ttl'] || 168 parsed_config[:redis]['connection_pool_size'] = string_to_int(ENV['REDIS_CONNECTION_POOL_SIZE']) || parsed_config[:redis]['connection_pool_size'] || 10 parsed_config[:redis]['connection_pool_timeout'] = string_to_int(ENV['REDIS_CONNECTION_POOL_TIMEOUT']) || parsed_config[:redis]['connection_pool_timeout'] || 5 - parsed_config[:redis]['reconnect_attempts'] = string_to_int(ENV['REDIS_RECONNECT_ATTEMPTS']) || parsed_config[:redis]['reconnect_attempts'] || 10 + parsed_config[:redis]['reconnect_attempts'] = string_array_to_array(ENV['REDIS_RECONNECT_ATTEMPTS']) || parsed_config[:redis]['reconnect_attempts'] || 10 parsed_config[:statsd] = parsed_config[:statsd] || {} if ENV['STATSD_SERVER'] parsed_config[:statsd]['server'] = ENV['STATSD_SERVER'] if ENV['STATSD_SERVER'] @@ -209,8 +209,7 @@ module Vmpooler end def self.new_redis(host = 'localhost', port = nil, password = nil, redis_reconnect_attempts = 10) - Redis.new(host: host, port: port, password: password, reconnect_attempts: redis_reconnect_attempts, reconnect_delay: 1.5, - reconnect_delay_max: 10.0) + Redis.new(host: host, port: port, password: password, reconnect_attempts: redis_reconnect_attempts, timeout: 5) end def self.pools(conf) @@ -235,6 +234,13 @@ module Vmpooler Integer(s) end + def self.string_array_to_array(s) + # Returns an array from an array like string + return if s.nil? + + JSON.parse(s) + end + def self.true?(obj) obj.to_s.downcase == 'true' end diff --git a/lib/vmpooler/pool_manager.rb b/lib/vmpooler/pool_manager.rb index ae1024a..151ea9c 100644 --- a/lib/vmpooler/pool_manager.rb +++ b/lib/vmpooler/pool_manager.rb @@ -129,16 +129,16 @@ module Vmpooler if exists request_id = redis.hget("vmpooler__vm__#{vm}", 'request_id') pool_alias = redis.hget("vmpooler__vm__#{vm}", 'pool_alias') if request_id - redis.multi - redis.smove("vmpooler__pending__#{pool}", "vmpooler__completed__#{pool}", vm) - if request_id - ondemandrequest_hash = redis.hgetall("vmpooler__odrequest__#{request_id}") - if ondemandrequest_hash && ondemandrequest_hash['status'] != 'failed' && ondemandrequest_hash['status'] != 'deleted' - # will retry a VM that did not come up as vm_ready? only if it has not been market failed or deleted - redis.zadd('vmpooler__odcreate__task', 1, "#{pool_alias}:#{pool}:1:#{request_id}") + redis.multi do |transaction| + transaction.smove("vmpooler__pending__#{pool}", "vmpooler__completed__#{pool}", vm) + if request_id + ondemandrequest_hash = transaction.hgetall("vmpooler__odrequest__#{request_id}") + if ondemandrequest_hash && ondemandrequest_hash['status'] != 'failed' && ondemandrequest_hash['status'] != 'deleted' + # will retry a VM that did not come up as vm_ready? only if it has not been market failed or deleted + redis.zadd('vmpooler__odcreate__task', 1, "#{pool_alias}:#{pool}:1:#{request_id}") + end end end - redis.exec $metrics.increment("errors.markedasfailed.#{pool}") $logger.log('d', "[!] [#{pool}] '#{vm}' marked as 'failed' after #{timeout} minutes") else @@ -429,15 +429,15 @@ module Vmpooler mutex.synchronize do @redis.with_metrics do |redis| # Add VM to Redis inventory ('pending' pool) - redis.multi - redis.sadd("vmpooler__pending__#{pool_name}", new_vmname) - redis.hset("vmpooler__vm__#{new_vmname}", 'clone', Time.now) - redis.hset("vmpooler__vm__#{new_vmname}", 'template', pool_name) # This value is used to represent the pool. - redis.hset("vmpooler__vm__#{new_vmname}", 'pool', pool_name) - redis.hset("vmpooler__vm__#{new_vmname}", 'domain', pool_domain) - redis.hset("vmpooler__vm__#{new_vmname}", 'request_id', request_id) if request_id - redis.hset("vmpooler__vm__#{new_vmname}", 'pool_alias', pool_alias) if pool_alias - redis.exec + redis.multi do |transaction| + transaction.sadd("vmpooler__pending__#{pool_name}", new_vmname) + transaction.hset("vmpooler__vm__#{new_vmname}", 'clone', Time.now) + transaction.hset("vmpooler__vm__#{new_vmname}", 'template', pool_name) # This value is used to represent the pool. + transaction.hset("vmpooler__vm__#{new_vmname}", 'pool', pool_name) + transaction.hset("vmpooler__vm__#{new_vmname}", 'domain', pool_domain) + transaction.hset("vmpooler__vm__#{new_vmname}", 'request_id', request_id) if request_id + transaction.hset("vmpooler__vm__#{new_vmname}", 'pool_alias', pool_alias) if pool_alias + end end begin @@ -870,9 +870,12 @@ module Vmpooler wakeup_by = Time.now + wakeup_period return if time_passed?(:exit_by, exit_by) - @redis.with_metrics do |redis| + @redis.with do |redis| + puts "vmpooler__ready__#{options[:poolname]}" initial_ready_size = redis.scard("vmpooler__ready__#{options[:poolname]}") if options[:pool_size_change] + puts initial_ready_size + initial_clone_target = redis.hget("vmpooler__pool__#{options[:poolname]}", options[:clone_target]) if options[:clone_target_change] initial_template = redis.hget('vmpooler__template__prepared', options[:poolname]) if options[:pool_template_change] @@ -917,11 +920,11 @@ module Vmpooler end if options[:ondemand_request] - redis.multi - redis.zcard('vmpooler__provisioning__request') - redis.zcard('vmpooler__provisioning__processing') - redis.zcard('vmpooler__odcreate__task') - od_request, od_processing, od_createtask = redis.exec + od_request, od_processing, od_createtask = redis.multi do |transaction| + transaction.zcard('vmpooler__provisioning__request') + transaction.zcard('vmpooler__provisioning__processing') + transaction.zcard('vmpooler__odcreate__task') + end break unless od_request == 0 break unless od_processing == 0 break unless od_createtask == 0 @@ -1093,10 +1096,10 @@ module Vmpooler def remove_excess_vms(pool) @redis.with_metrics do |redis| - redis.multi - redis.scard("vmpooler__ready__#{pool['name']}") - redis.scard("vmpooler__pending__#{pool['name']}") - ready, pending = redis.exec + ready, pending = redis.multi do |transaction| + transaction.scard("vmpooler__ready__#{pool['name']}") + transaction.scard("vmpooler__pending__#{pool['name']}") + end total = pending.to_i + ready.to_i break if total.nil? break if total == 0 @@ -1334,11 +1337,11 @@ module Vmpooler return if pool_mutex(pool_name).locked? @redis.with_metrics do |redis| - redis.multi - redis.scard("vmpooler__ready__#{pool_name}") - redis.scard("vmpooler__pending__#{pool_name}") - redis.scard("vmpooler__running__#{pool_name}") - ready, pending, running = redis.exec + ready, pending, running = redis.multi do |transaction| + transaction.scard("vmpooler__ready__#{pool_name}") + transaction.scard("vmpooler__pending__#{pool_name}") + transaction.scard("vmpooler__running__#{pool_name}") + end total = pending.to_i + ready.to_i $metrics.gauge("ready.#{pool_name}", ready) @@ -1594,11 +1597,11 @@ module Vmpooler return unless vms_ready?(request_id, redis) - redis.multi - redis.hset(ondemand_hash_key, 'status', 'ready') - redis.expire(ondemand_hash_key, default_expiration) - redis.zrem(processing_key, request_id) - redis.exec + redis.multi do |transaction| + transaction.hset(ondemand_hash_key, 'status', 'ready') + transaction.expire(ondemand_hash_key, default_expiration) + transaction.zrem(processing_key, request_id) + end end def request_expired?(request_id, score, redis) @@ -1633,7 +1636,7 @@ module Vmpooler def execute!(maxloop = 0, loop_delay = 1) $logger.log('d', 'starting vmpooler') - @redis.with_metrics do |redis| + @redis.with do |redis| # Clear out the tasks manager, as we don't know about any tasks at this point redis.set('vmpooler__tasks__clone', 0) redis.set('vmpooler__tasks__ondemandclone', 0) diff --git a/vmpooler.gemspec b/vmpooler.gemspec index 22b19b6..f7fa364 100644 --- a/vmpooler.gemspec +++ b/vmpooler.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |s| s.executables = 'vmpooler' s.require_paths = ["lib"] s.add_dependency 'concurrent-ruby', '~> 1.1' - s.add_dependency 'connection_pool', '~> 2.2' + s.add_dependency 'connection_pool', '~> 2.4' s.add_dependency 'deep_merge', '~> 1.2' s.add_dependency 'net-ldap', '~> 0.16' s.add_dependency 'opentelemetry-exporter-jaeger', '= 0.22.0' @@ -32,7 +32,7 @@ Gem::Specification.new do |s| s.add_dependency 'puma', '>= 5.0.4', '< 7' s.add_dependency 'rack', '>= 2.2', '< 4.0' s.add_dependency 'rake', '~> 13.0' - s.add_dependency 'redis', '~> 4.1' + s.add_dependency 'redis', '~> 5.0' s.add_dependency 'sinatra', '>= 2', '< 4' s.add_dependency 'spicy-proton', '~> 2.1' s.add_dependency 'statsd-ruby', '~> 1.4'