From 2f1a83eeb6585881e4ef3d99ae1ca80b46b38fa6 Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Thu, 5 Dec 2013 11:44:11 -0800 Subject: [PATCH] Avoid racing, only hand over VMs after a successful smove --- vmware-host-pooler-api | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/vmware-host-pooler-api b/vmware-host-pooler-api index 25e0257..13f5d5c 100755 --- a/vmware-host-pooler-api +++ b/vmware-host-pooler-api @@ -62,14 +62,26 @@ post '/vm/:template' do result[params[:template]]['error'] = 'You must specify a destination \'folder\' and \'pool\'' else if ( $redis.scard('vmware_host_pool__ready__'+params[:template]) > 0 ) - vm = $redis.srandmember('vmware_host_pool__ready__'+params[:template]) - $redis.srem('vmware_host_pool__ready__'+params[:template], vm) - $redis.sadd('vmware_host_pool__running__'+params[:template], vm) + vm = nil - logger.log('s', "[<] '#{vm}' moved to 'running' queue") + try = $redis.srandmember('vmware_host_pool__ready__'+params[:template]) - result[params[:template]]['ok'] = true - result[params[:template]]['hostname'] = vm + if ( + $redis.smove( + 'vmware_host_pool__ready__'+params[:template], + 'vmware_host_pool__running__'+params[:template], + try + ) + ) + vm = try + + logger.log('s', "[<] '#{vm}' moved to 'running' queue") + + result[params[:template]]['ok'] = true + result[params[:template]]['hostname'] = vm + else + result[params[:template]]['ok'] = false + end else result[params[:template]]['ok'] = false end