Skip to content

Commit 77cc124

Browse files
authored
Merge pull request #561 from puppetlabs/update_redis
(RE-15162) Update Redis gem to version 5.0.
2 parents f6c4acf + e732257 commit 77cc124

File tree

7 files changed

+68
-56
lines changed

7 files changed

+68
-56
lines changed

Gemfile.lock

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ PATH
33
specs:
44
vmpooler (3.2.0)
55
concurrent-ruby (~> 1.1)
6-
connection_pool (~> 2.2)
6+
connection_pool (~> 2.4)
77
deep_merge (~> 1.2)
88
net-ldap (~> 0.16)
99
opentelemetry-exporter-jaeger (= 0.23.0)
@@ -18,7 +18,7 @@ PATH
1818
puma (>= 5.0.4, < 7)
1919
rack (>= 2.2, < 4.0)
2020
rake (~> 13.0)
21-
redis (~> 4.1)
21+
redis (~> 5.0)
2222
sinatra (>= 2, < 4)
2323
spicy-proton (~> 2.1)
2424
statsd-ruby (~> 1.4)
@@ -124,7 +124,10 @@ GEM
124124
rack (>= 1.3)
125125
rainbow (3.1.1)
126126
rake (13.0.6)
127-
redis (4.8.1)
127+
redis (5.0.7)
128+
redis-client (>= 0.9.0)
129+
redis-client (0.15.0)
130+
connection_pool
128131
regexp_parser (2.8.1)
129132
rexml (3.2.6)
130133
rspec (3.12.0)

lib/vmpooler.rb

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def self.config(filepath = 'vmpooler.yaml')
103103
parsed_config[:redis]['data_ttl'] = string_to_int(ENV['REDIS_DATA_TTL']) || parsed_config[:redis]['data_ttl'] || 168
104104
parsed_config[:redis]['connection_pool_size'] = string_to_int(ENV['REDIS_CONNECTION_POOL_SIZE']) || parsed_config[:redis]['connection_pool_size'] || 10
105105
parsed_config[:redis]['connection_pool_timeout'] = string_to_int(ENV['REDIS_CONNECTION_POOL_TIMEOUT']) || parsed_config[:redis]['connection_pool_timeout'] || 5
106-
parsed_config[:redis]['reconnect_attempts'] = string_to_int(ENV['REDIS_RECONNECT_ATTEMPTS']) || parsed_config[:redis]['reconnect_attempts'] || 10
106+
parsed_config[:redis]['reconnect_attempts'] = string_array_to_array(ENV['REDIS_RECONNECT_ATTEMPTS']) || parsed_config[:redis]['reconnect_attempts'] || 10
107107

108108
parsed_config[:statsd] = parsed_config[:statsd] || {} if ENV['STATSD_SERVER']
109109
parsed_config[:statsd]['server'] = ENV['STATSD_SERVER'] if ENV['STATSD_SERVER']
@@ -209,8 +209,13 @@ def self.redis_connection_pool(host, port, password, size, timeout, metrics, red
209209
end
210210

211211
def self.new_redis(host = 'localhost', port = nil, password = nil, redis_reconnect_attempts = 10)
212-
Redis.new(host: host, port: port, password: password, reconnect_attempts: redis_reconnect_attempts, reconnect_delay: 1.5,
213-
reconnect_delay_max: 10.0)
212+
Redis.new(
213+
host: host,
214+
port: port,
215+
password: password,
216+
reconnect_attempts: redis_reconnect_attempts,
217+
connect_timeout: 300
218+
)
214219
end
215220

216221
def self.pools(conf)
@@ -235,6 +240,13 @@ def self.string_to_int(s)
235240
Integer(s)
236241
end
237242

243+
def self.string_array_to_array(s)
244+
# Returns an array from an array like string
245+
return if s.nil?
246+
247+
JSON.parse(s)
248+
end
249+
238250
def self.true?(obj)
239251
obj.to_s.downcase == 'true'
240252
end

lib/vmpooler/api/helpers.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def valid_token?(backend)
2525
def validate_token(backend)
2626
tracer.in_span("Vmpooler::API::Helpers.#{__method__}") do
2727
if valid_token?(backend)
28-
backend.hset("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}", 'last', Time.now)
28+
backend.hset("vmpooler__token__#{request.env['HTTP_X_AUTH_TOKEN']}", 'last', Time.now.to_s)
2929

3030
return true
3131
end

lib/vmpooler/api/v3.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ def account_for_starting_vm(template, vm)
189189
span.set_attribute('enduser.id', user)
190190
has_token_result = has_token?
191191
backend.sadd("vmpooler__migrating__#{template}", vm)
192-
backend.hset("vmpooler__active__#{template}", vm, Time.now)
193-
backend.hset("vmpooler__vm__#{vm}", 'checkout', Time.now)
192+
backend.hset("vmpooler__active__#{template}", vm, Time.now.to_s)
193+
backend.hset("vmpooler__vm__#{vm}", 'checkout', Time.now.to_s)
194194

195195
if Vmpooler::API.settings.config[:auth] and has_token_result
196196
backend.hset("vmpooler__vm__#{vm}", 'token:token', request.env['HTTP_X_AUTH_TOKEN'])
@@ -971,7 +971,7 @@ def generate_request_id
971971
result['token'] = o[rand(25)] + (0...31).map { o[rand(o.length)] }.join
972972

973973
backend.hset("vmpooler__token__#{result['token']}", 'user', @auth.username)
974-
backend.hset("vmpooler__token__#{result['token']}", 'created', Time.now)
974+
backend.hset("vmpooler__token__#{result['token']}", 'created', Time.now.to_s)
975975
span = OpenTelemetry::Trace.current_span
976976
span.set_attribute('enduser.id', @auth.username)
977977

lib/vmpooler/pool_manager.rb

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def load_pools_to_redis
5959
currently_configured_pools = []
6060
config[:pools].each do |pool|
6161
currently_configured_pools << pool['name']
62-
redis.sadd('vmpooler__pools', pool['name'])
62+
redis.sadd('vmpooler__pools', pool['name'].to_s)
6363
pool_keys = pool.keys
6464
pool_keys.delete('alias')
6565
to_set = {}
@@ -68,11 +68,12 @@ def load_pools_to_redis
6868
end
6969
to_set['alias'] = pool['alias'].join(',') if to_set.key?('alias')
7070
to_set['domain'] = Vmpooler::Dns.get_domain_for_pool(config, pool['name'])
71-
redis.hmset("vmpooler__pool__#{pool['name']}", to_set.to_a.flatten) unless to_set.empty?
71+
72+
redis.hmset("vmpooler__pool__#{pool['name']}", *to_set.to_a.flatten) unless to_set.empty?
7273
end
7374
previously_configured_pools.each do |pool|
7475
unless currently_configured_pools.include? pool
75-
redis.srem('vmpooler__pools', pool)
76+
redis.srem('vmpooler__pools', pool.to_s)
7677
redis.del("vmpooler__pool__#{pool}")
7778
end
7879
end
@@ -129,7 +130,6 @@ def fail_pending_vm(vm, pool, timeout, redis, exists: true)
129130
if exists
130131
request_id = redis.hget("vmpooler__vm__#{vm}", 'request_id')
131132
pool_alias = redis.hget("vmpooler__vm__#{vm}", 'pool_alias') if request_id
132-
redis.multi
133133
redis.smove("vmpooler__pending__#{pool}", "vmpooler__completed__#{pool}", vm)
134134
if request_id
135135
ondemandrequest_hash = redis.hgetall("vmpooler__odrequest__#{request_id}")
@@ -138,7 +138,6 @@ def fail_pending_vm(vm, pool, timeout, redis, exists: true)
138138
redis.zadd('vmpooler__odcreate__task', 1, "#{pool_alias}:#{pool}:1:#{request_id}")
139139
end
140140
end
141-
redis.exec
142141
$metrics.increment("errors.markedasfailed.#{pool}")
143142
$logger.log('d', "[!] [#{pool}] '#{vm}' marked as 'failed' after #{timeout} minutes")
144143
else
@@ -168,8 +167,8 @@ def move_pending_vm_to_ready(vm, pool, redis, request_id = nil)
168167
pool_alias = redis.hget("vmpooler__vm__#{vm}", 'pool_alias')
169168

170169
redis.pipelined do |pipeline|
171-
pipeline.hset("vmpooler__active__#{pool}", vm, Time.now)
172-
pipeline.hset("vmpooler__vm__#{vm}", 'checkout', Time.now)
170+
pipeline.hset("vmpooler__active__#{pool}", vm, Time.now.to_s)
171+
pipeline.hset("vmpooler__vm__#{vm}", 'checkout', Time.now.to_s)
173172
if ondemandrequest_hash['token:token']
174173
pipeline.hset("vmpooler__vm__#{vm}", 'token:token', ondemandrequest_hash['token:token'])
175174
pipeline.hset("vmpooler__vm__#{vm}", 'token:user', ondemandrequest_hash['token:user'])
@@ -185,10 +184,10 @@ def move_pending_vm_to_ready(vm, pool, redis, request_id = nil)
185184

186185
redis.pipelined do |pipeline|
187186
pipeline.hset("vmpooler__boot__#{Date.today}", "#{pool}:#{vm}", finish) # maybe remove as this is never used by vmpooler itself?
188-
pipeline.hset("vmpooler__vm__#{vm}", 'ready', Time.now)
187+
pipeline.hset("vmpooler__vm__#{vm}", 'ready', Time.now.to_s)
189188

190189
# last boot time is displayed in API, and used by alarming script
191-
pipeline.hset('vmpooler__lastboot', pool, Time.now)
190+
pipeline.hset('vmpooler__lastboot', pool, Time.now.to_s)
192191
end
193192

194193
$metrics.timing("time_to_ready_state.#{pool}", finish)
@@ -227,7 +226,7 @@ def _check_ready_vm(vm, pool_name, ttl, provider)
227226
last_checked_too_soon = ((Time.now - Time.parse(check_stamp)).to_i < $config[:config]['vm_checktime'] * 60) if check_stamp
228227
break if check_stamp && last_checked_too_soon
229228

230-
redis.hset("vmpooler__vm__#{vm}", 'check', Time.now)
229+
redis.hset("vmpooler__vm__#{vm}", 'check', Time.now.to_s)
231230
# Check if the hosts TTL has expired
232231
# if 'boottime' is nil, set bootime to beginning of unix epoch, forces TTL to be assumed expired
233232
boottime = redis.hget("vmpooler__vm__#{vm}", 'ready')
@@ -428,16 +427,15 @@ def _clone_vm(pool_name, provider, dns_plugin, request_id = nil, pool_alias = ni
428427
mutex = vm_mutex(new_vmname)
429428
mutex.synchronize do
430429
@redis.with_metrics do |redis|
431-
# Add VM to Redis inventory ('pending' pool)
432-
redis.multi
433-
redis.sadd("vmpooler__pending__#{pool_name}", new_vmname)
434-
redis.hset("vmpooler__vm__#{new_vmname}", 'clone', Time.now)
435-
redis.hset("vmpooler__vm__#{new_vmname}", 'template', pool_name) # This value is used to represent the pool.
436-
redis.hset("vmpooler__vm__#{new_vmname}", 'pool', pool_name)
437-
redis.hset("vmpooler__vm__#{new_vmname}", 'domain', pool_domain)
438-
redis.hset("vmpooler__vm__#{new_vmname}", 'request_id', request_id) if request_id
439-
redis.hset("vmpooler__vm__#{new_vmname}", 'pool_alias', pool_alias) if pool_alias
440-
redis.exec
430+
redis.multi do |transaction|
431+
transaction.sadd("vmpooler__pending__#{pool_name}", new_vmname)
432+
transaction.hset("vmpooler__vm__#{new_vmname}", 'clone', Time.now.to_s)
433+
transaction.hset("vmpooler__vm__#{new_vmname}", 'template', pool_name) # This value is used to represent the pool.
434+
transaction.hset("vmpooler__vm__#{new_vmname}", 'pool', pool_name)
435+
transaction.hset("vmpooler__vm__#{new_vmname}", 'domain', pool_domain)
436+
transaction.hset("vmpooler__vm__#{new_vmname}", 'request_id', request_id) if request_id
437+
transaction.hset("vmpooler__vm__#{new_vmname}", 'pool_alias', pool_alias) if pool_alias
438+
end
441439
end
442440

443441
begin
@@ -502,7 +500,7 @@ def _destroy_vm(vm, pool, provider, dns_plugin)
502500
@redis.with_metrics do |redis|
503501
redis.pipelined do |pipeline|
504502
pipeline.hdel("vmpooler__active__#{pool}", vm)
505-
pipeline.hset("vmpooler__vm__#{vm}", 'destroy', Time.now)
503+
pipeline.hset("vmpooler__vm__#{vm}", 'destroy', Time.now.to_s)
506504

507505
# Auto-expire metadata key
508506
pipeline.expire("vmpooler__vm__#{vm}", ($config[:redis]['data_ttl'].to_i * 60 * 60))
@@ -868,12 +866,13 @@ def time_passed?(_event, time)
868866
def sleep_with_wakeup_events(loop_delay, wakeup_period = 5, options = {})
869867
exit_by = Time.now + loop_delay
870868
wakeup_by = Time.now + wakeup_period
869+
871870
return if time_passed?(:exit_by, exit_by)
872871

873872
@redis.with_metrics do |redis|
874873
initial_ready_size = redis.scard("vmpooler__ready__#{options[:poolname]}") if options[:pool_size_change]
875874

876-
initial_clone_target = redis.hget("vmpooler__pool__#{options[:poolname]}", options[:clone_target]) if options[:clone_target_change]
875+
initial_clone_target = redis.hget("vmpooler__pool__#{options[:poolname]}", options[:clone_target].to_s) if options[:clone_target_change]
877876

878877
initial_template = redis.hget('vmpooler__template__prepared', options[:poolname]) if options[:pool_template_change]
879878

@@ -917,11 +916,10 @@ def sleep_with_wakeup_events(loop_delay, wakeup_period = 5, options = {})
917916
end
918917

919918
if options[:ondemand_request]
920-
redis.multi
921-
redis.zcard('vmpooler__provisioning__request')
922-
redis.zcard('vmpooler__provisioning__processing')
923-
redis.zcard('vmpooler__odcreate__task')
924-
od_request, od_processing, od_createtask = redis.exec
919+
od_request = redis.zcard('vmpooler__provisioning__request')
920+
od_processing = redis.zcard('vmpooler__provisioning__processing')
921+
od_createtask = redis.zcard('vmpooler__odcreate__task')
922+
925923
break unless od_request == 0
926924
break unless od_processing == 0
927925
break unless od_createtask == 0
@@ -1093,10 +1091,8 @@ def update_clone_target(pool)
10931091

10941092
def remove_excess_vms(pool)
10951093
@redis.with_metrics do |redis|
1096-
redis.multi
1097-
redis.scard("vmpooler__ready__#{pool['name']}")
1098-
redis.scard("vmpooler__pending__#{pool['name']}")
1099-
ready, pending = redis.exec
1094+
ready = redis.scard("vmpooler__ready__#{pool['name']}")
1095+
pending = redis.scard("vmpooler__pending__#{pool['name']}")
11001096
total = pending.to_i + ready.to_i
11011097
break if total.nil?
11021098
break if total == 0
@@ -1334,11 +1330,10 @@ def repopulate_pool_vms(pool_name, provider, pool_check_response, pool_size)
13341330
return if pool_mutex(pool_name).locked?
13351331

13361332
@redis.with_metrics do |redis|
1337-
redis.multi
1338-
redis.scard("vmpooler__ready__#{pool_name}")
1339-
redis.scard("vmpooler__pending__#{pool_name}")
1340-
redis.scard("vmpooler__running__#{pool_name}")
1341-
ready, pending, running = redis.exec
1333+
ready = redis.scard("vmpooler__ready__#{pool_name}")
1334+
pending = redis.scard("vmpooler__pending__#{pool_name}")
1335+
running = redis.scard("vmpooler__running__#{pool_name}")
1336+
13421337
total = pending.to_i + ready.to_i
13431338

13441339
$metrics.gauge("ready.#{pool_name}", ready)
@@ -1596,11 +1591,9 @@ def check_ondemand_request_ready(request_id, redis, score = nil)
15961591

15971592
return unless vms_ready?(request_id, redis)
15981593

1599-
redis.multi
16001594
redis.hset(ondemand_hash_key, 'status', 'ready')
16011595
redis.expire(ondemand_hash_key, default_expiration)
16021596
redis.zrem(processing_key, request_id)
1603-
redis.exec
16041597
end
16051598

16061599
def request_expired?(request_id, score, redis)

spec/unit/pool_manager_spec.rb

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3594,8 +3594,9 @@
35943594
it 'should sleep until the provisioning request is detected' do
35953595
redis_connection_pool.with do |redis|
35963596
expect(subject).to receive(:sleep).exactly(3).times
3597-
expect(redis).to receive(:multi).and_return('OK').exactly(3).times
3598-
expect(redis).to receive(:exec).and_return([0,0,0],[0,0,0],[1,0,0])
3597+
expect(redis).to receive(:zcard).with('vmpooler__provisioning__request').and_return(0,0,1)
3598+
expect(redis).to receive(:zcard).with('vmpooler__provisioning__processing').and_return(0,0,0)
3599+
expect(redis).to receive(:zcard).with('vmpooler__odcreate__task').and_return(0,0,0)
35993600
end
36003601

36013602
subject.sleep_with_wakeup_events(loop_delay, wakeup_period, wakeup_option)
@@ -3604,17 +3605,20 @@
36043605
it 'should sleep until provisioning processing is detected' do
36053606
redis_connection_pool.with do |redis|
36063607
expect(subject).to receive(:sleep).exactly(3).times
3607-
expect(redis).to receive(:multi).and_return('OK').exactly(3).times
3608-
expect(redis).to receive(:exec).and_return([0,0,0],[0,0,0],[0,1,0])
3608+
expect(redis).to receive(:zcard).with('vmpooler__provisioning__request').and_return(0,0,0)
3609+
expect(redis).to receive(:zcard).with('vmpooler__provisioning__processing').and_return(0,0,1)
3610+
expect(redis).to receive(:zcard).with('vmpooler__odcreate__task').and_return(0,0,0)
36093611
end
3612+
36103613
subject.sleep_with_wakeup_events(loop_delay, wakeup_period, wakeup_option)
36113614
end
36123615

36133616
it 'should sleep until ondemand creation task is detected' do
36143617
redis_connection_pool.with do |redis|
36153618
expect(subject).to receive(:sleep).exactly(3).times
3616-
expect(redis).to receive(:multi).and_return('OK').exactly(3).times
3617-
expect(redis).to receive(:exec).and_return([0,0,0],[0,0,0],[0,0,1])
3619+
expect(redis).to receive(:zcard).with('vmpooler__provisioning__request').and_return(0,0,0)
3620+
expect(redis).to receive(:zcard).with('vmpooler__provisioning__processing').and_return(0,0,0)
3621+
expect(redis).to receive(:zcard).with('vmpooler__odcreate__task').and_return(0,0,1)
36183622
end
36193623

36203624
subject.sleep_with_wakeup_events(loop_delay, wakeup_period, wakeup_option)

vmpooler.gemspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
1717
s.executables = 'vmpooler'
1818
s.require_paths = ["lib"]
1919
s.add_dependency 'concurrent-ruby', '~> 1.1'
20-
s.add_dependency 'connection_pool', '~> 2.2'
20+
s.add_dependency 'connection_pool', '~> 2.4'
2121
s.add_dependency 'deep_merge', '~> 1.2'
2222
s.add_dependency 'net-ldap', '~> 0.16'
2323
s.add_dependency 'opentelemetry-exporter-jaeger', '= 0.23.0'
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
3232
s.add_dependency 'puma', '>= 5.0.4', '< 7'
3333
s.add_dependency 'rack', '>= 2.2', '< 4.0'
3434
s.add_dependency 'rake', '~> 13.0'
35-
s.add_dependency 'redis', '~> 4.1'
35+
s.add_dependency 'redis', '~> 5.0'
3636
s.add_dependency 'sinatra', '>= 2', '< 4'
3737
s.add_dependency 'spicy-proton', '~> 2.1'
3838
s.add_dependency 'statsd-ruby', '~> 1.4'

0 commit comments

Comments
 (0)