From 490e5c193830c254ec48e62cec45839841df8823 Mon Sep 17 00:00:00 2001 From: "kirby@puppetlabs.com" Date: Mon, 23 Jul 2018 15:58:09 -0700 Subject: [PATCH] (POOLER-128) Remove references to VM mutex when destroying This commit updates destroy_vm to remove references to its mutex tracking object when destroyed. Without this change a VM that is destroyed will leave its mutex tracking object forever causing the pool manager memory footprint to increase. --- CHANGELOG.md | 4 ++++ lib/vmpooler/pool_manager.rb | 9 +++++++++ spec/unit/pool_manager_spec.rb | 26 ++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a193b34..90e7acc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,10 @@ git logs & PR history. # [Unreleased](https://github.com/puppetlabs/vmpooler/compare/0.1.0...master) +### Fixed + +- (POOLER-128) VM specific mutex objects are not dereferenced when a VM is destroyed + # [0.1.0](https://github.com/puppetlabs/vmpooler/compare/4c858d012a262093383e57ea6db790521886d8d4...master) ### Fixed diff --git a/lib/vmpooler/pool_manager.rb b/lib/vmpooler/pool_manager.rb index 34d3c55..666fb66 100644 --- a/lib/vmpooler/pool_manager.rb +++ b/lib/vmpooler/pool_manager.rb @@ -313,6 +313,7 @@ module Vmpooler $logger.log('s', "[-] [#{pool}] '#{vm}' destroyed in #{finish} seconds") $metrics.timing("destroy.#{pool}", finish) end + dereference_mutex(vm) end def purge_unused_vms_and_folders @@ -681,6 +682,14 @@ module Vmpooler @vm_mutex[vmname] || @vm_mutex[vmname] = Mutex.new end + def dereference_mutex(vmname) + if @vm_mutex.delete(vmname) + return true + else + return + end + end + def sync_pool_template(pool) pool_template = $redis.hget('vmpooler__config__template', pool['name']) if pool_template diff --git a/spec/unit/pool_manager_spec.rb b/spec/unit/pool_manager_spec.rb index 27c2674..2033c2e 100644 --- a/spec/unit/pool_manager_spec.rb +++ b/spec/unit/pool_manager_spec.rb @@ -726,6 +726,12 @@ EOT subject._destroy_vm(vm,pool,provider) end + + it 'should dereference the mutex' do + expect(subject).to receive(:dereference_mutex) + + subject._destroy_vm(vm,pool,provider) + end end context 'when the VM destruction raises an eror' do @@ -1690,6 +1696,26 @@ EOT end end + describe '#dereference_mutex' do + it 'should return nil when no mutex is dereferenced' do + expect(subject.dereference_mutex(vm)).to be_nil + end + + it 'should return true when a mutex is dereferenced' do + subject.vm_mutex(vm) + expect(subject.dereference_mutex(vm)).to be true + end + + it 'should dereference the mutex' do + mutex = subject.vm_mutex(vm) + + subject.dereference_mutex(vm) + + result = subject.vm_mutex(vm) + expect(result).to_not eq(mutex) + end + end + describe 'sync_pool_template' do let(:old_template) { 'templates/old-template' } let(:new_template) { 'templates/new-template' }