Merge pull request #270 from mattkirby/no_duplicate_vms_in_pool

Do not run duplicate instances of inventory check for a pool
This commit is contained in:
mchllweeks 2018-07-09 12:48:41 -07:00 committed by GitHub
commit 69f8b21ca8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 12 deletions

View file

@ -710,21 +710,24 @@ module Vmpooler
# INVENTORY # INVENTORY
inventory = {} inventory = {}
begin begin
provider.vms_in_pool(pool['name']).each do |vm| mutex = pool_mutex(pool['name'])
if !$redis.sismember('vmpooler__running__' + pool['name'], vm['name']) && mutex.synchronize do
!$redis.sismember('vmpooler__ready__' + pool['name'], vm['name']) && provider.vms_in_pool(pool['name']).each do |vm|
!$redis.sismember('vmpooler__pending__' + pool['name'], vm['name']) && if !$redis.sismember('vmpooler__running__' + pool['name'], vm['name']) &&
!$redis.sismember('vmpooler__completed__' + pool['name'], vm['name']) && !$redis.sismember('vmpooler__ready__' + pool['name'], vm['name']) &&
!$redis.sismember('vmpooler__discovered__' + pool['name'], vm['name']) && !$redis.sismember('vmpooler__pending__' + pool['name'], vm['name']) &&
!$redis.sismember('vmpooler__migrating__' + 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 pool_check_response[:discovered_vms] += 1
$redis.sadd('vmpooler__discovered__' + pool['name'], vm['name']) $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 end
inventory[vm['name']] = 1
end end
rescue => err rescue => err
$logger.log('s', "[!] [#{pool['name']}] _check_pool failed with an error while inspecting inventory: #{err}") $logger.log('s', "[!] [#{pool['name']}] _check_pool failed with an error while inspecting inventory: #{err}")

View file

@ -2693,6 +2693,7 @@ EOT
let(:pool_object) { config[:pools][0] } let(:pool_object) { config[:pools][0] }
let(:new_vm) { 'newvm'} let(:new_vm) { 'newvm'}
let(:pool_name) { pool_object['name'] } let(:pool_name) { pool_object['name'] }
let(:mutex) { Mutex.new }
before do before do
expect(subject).not_to be_nil expect(subject).not_to be_nil
@ -2798,6 +2799,27 @@ EOT
end end
end 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 end
# RUNNING # RUNNING