diff --git a/lib/vmpooler/pool_manager.rb b/lib/vmpooler/pool_manager.rb index 55df2d9..be71a6c 100644 --- a/lib/vmpooler/pool_manager.rb +++ b/lib/vmpooler/pool_manager.rb @@ -710,21 +710,24 @@ module Vmpooler # INVENTORY inventory = {} begin - provider.vms_in_pool(pool['name']).each do |vm| - if !$redis.sismember('vmpooler__running__' + pool['name'], vm['name']) && - !$redis.sismember('vmpooler__ready__' + pool['name'], vm['name']) && - !$redis.sismember('vmpooler__pending__' + pool['name'], vm['name']) && - !$redis.sismember('vmpooler__completed__' + pool['name'], vm['name']) && - !$redis.sismember('vmpooler__discovered__' + pool['name'], vm['name']) && - !$redis.sismember('vmpooler__migrating__' + pool['name'], vm['name']) + mutex = pool_mutex(pool['name']) + mutex.synchronize do + provider.vms_in_pool(pool['name']).each do |vm| + if !$redis.sismember('vmpooler__running__' + pool['name'], vm['name']) && + !$redis.sismember('vmpooler__ready__' + pool['name'], vm['name']) && + !$redis.sismember('vmpooler__pending__' + pool['name'], vm['name']) && + !$redis.sismember('vmpooler__completed__' + pool['name'], vm['name']) && + !$redis.sismember('vmpooler__discovered__' + pool['name'], vm['name']) && + !$redis.sismember('vmpooler__migrating__' + pool['name'], vm['name']) - pool_check_response[:discovered_vms] += 1 - $redis.sadd('vmpooler__discovered__' + pool['name'], vm['name']) + pool_check_response[:discovered_vms] += 1 + $redis.sadd('vmpooler__discovered__' + pool['name'], vm['name']) - $logger.log('s', "[?] [#{pool['name']}] '#{vm['name']}' added to 'discovered' queue") + $logger.log('s', "[?] [#{pool['name']}] '#{vm['name']}' added to 'discovered' queue") + end + + inventory[vm['name']] = 1 end - - inventory[vm['name']] = 1 end rescue => err $logger.log('s', "[!] [#{pool['name']}] _check_pool failed with an error while inspecting inventory: #{err}") diff --git a/spec/unit/pool_manager_spec.rb b/spec/unit/pool_manager_spec.rb index 7e14928..579917a 100644 --- a/spec/unit/pool_manager_spec.rb +++ b/spec/unit/pool_manager_spec.rb @@ -2693,6 +2693,7 @@ EOT let(:pool_object) { config[:pools][0] } let(:new_vm) { 'newvm'} let(:pool_name) { pool_object['name'] } + let(:mutex) { Mutex.new } before do expect(subject).not_to be_nil @@ -2798,6 +2799,27 @@ EOT end end end + + it 'should get the pool mutex' do + expect(subject).to receive(:pool_mutex).and_return(mutex).at_least(:once) + + subject._check_pool(pool_object,provider) + end + + it 'should run synchronize' do + expect(subject).to receive(:pool_mutex).and_return(mutex).at_least(:once) + expect(mutex).to receive(:synchronize).at_least(:once) + + subject._check_pool(pool_object,provider) + end + + it 'should yield when locked' do + expect(subject).to receive(:pool_mutex).and_return(mutex).at_least(:once) + mutex.lock + expect(mutex).to receive(:synchronize).and_yield + + subject._check_pool(pool_object,provider) + end end # RUNNING