Merge pull request #339 from mattkirby/pooler_150

(POOLER-150) Synchronize checkout operations for API
This commit is contained in:
Kevin Imber 2019-10-22 09:02:35 -07:00 committed by GitHub
commit a6e3e3a98f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 27 additions and 14 deletions

View file

@ -14,6 +14,7 @@ git logs & PR history.
### Fixed ### Fixed
- Correctly detect create\_linked\_clone on a pool level (POOLER-147) - Correctly detect create\_linked\_clone on a pool level (POOLER-147)
- Ensure that checkout operations are synchronized
# [0.7.0](https://github.com/puppetlabs/vmpooler/compare/0.6.3...0.7.0) # [0.7.0](https://github.com/puppetlabs/vmpooler/compare/0.6.3...0.7.0)

View file

@ -24,7 +24,8 @@ if torun.include? 'api'
api = Thread.new do api = Thread.new do
thr = Vmpooler::API.new thr = Vmpooler::API.new
redis = Vmpooler.new_redis(redis_host, redis_port, redis_password) redis = Vmpooler.new_redis(redis_host, redis_port, redis_password)
thr.helpers.configure(config, redis, metrics) checkoutlock = Mutex.new
thr.helpers.configure(config, redis, metrics, checkoutlock)
thr.helpers.execute! thr.helpers.execute!
end end
torun_threads << api torun_threads << api

View file

@ -36,10 +36,11 @@ module Vmpooler
use Vmpooler::API::Reroute use Vmpooler::API::Reroute
use Vmpooler::API::V1 use Vmpooler::API::V1
def configure(config, redis, metrics) def configure(config, redis, metrics, checkoutlock)
self.settings.set :config, config self.settings.set :config, config
self.settings.set :redis, redis self.settings.set :redis, redis
self.settings.set :metrics, metrics self.settings.set :metrics, metrics
self.settings.set :checkoutlock, checkoutlock
end end
def execute! def execute!

View file

@ -36,6 +36,10 @@ module Vmpooler
validate_token(backend) validate_token(backend)
end end
def checkoutlock
Vmpooler::API::settings.checkoutlock
end
def fetch_single_vm(template) def fetch_single_vm(template)
template_backends = [template] template_backends = [template]
aliases = Vmpooler::API.settings.config[:alias] aliases = Vmpooler::API.settings.config[:alias]
@ -67,21 +71,23 @@ module Vmpooler
end end
end end
template_backends.each do |template_backend| checkoutlock.synchronize do
vms = backend.smembers("vmpooler__ready__#{template_backend}") template_backends.each do |template_backend|
next if vms.empty? vms = backend.smembers("vmpooler__ready__#{template_backend}")
vms.reverse.each do |vm| next if vms.empty?
ready = vm_ready?(vm, config['domain']) vms.reverse.each do |vm|
if ready ready = vm_ready?(vm, config['domain'])
backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__running__#{template_backend}", vm) if ready
return [vm, template_backend, template] backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__running__#{template_backend}", vm)
else return [vm, template_backend, template]
backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__completed__#{template_backend}", vm) else
metrics.increment("checkout.nonresponsive.#{template_backend}") backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__completed__#{template_backend}", vm)
metrics.increment("checkout.nonresponsive.#{template_backend}")
end
end end
end end
[nil, nil, nil]
end end
[nil, nil, nil]
end end
def return_vm_to_ready_state(template, vm) def return_vm_to_ready_state(template, vm)

View file

@ -29,12 +29,14 @@ describe Vmpooler::API::V1 do
} }
let(:current_time) { Time.now } let(:current_time) { Time.now }
let(:vmname) { 'abcdefghijkl' } let(:vmname) { 'abcdefghijkl' }
let(:checkoutlock) { Mutex.new }
before(:each) do before(:each) do
app.settings.set :config, config app.settings.set :config, config
app.settings.set :redis, redis app.settings.set :redis, redis
app.settings.set :metrics, metrics app.settings.set :metrics, metrics
app.settings.set :config, auth: false app.settings.set :config, auth: false
app.settings.set :checkoutlock, checkoutlock
create_token('abcdefghijklmnopqrstuvwxyz012345', 'jdoe', current_time) create_token('abcdefghijklmnopqrstuvwxyz012345', 'jdoe', current_time)
end end

View file

@ -29,12 +29,14 @@ describe Vmpooler::API::V1 do
let(:current_time) { Time.now } let(:current_time) { Time.now }
let(:socket) { double('socket') } let(:socket) { double('socket') }
let(:checkoutlock) { Mutex.new }
before(:each) do before(:each) do
app.settings.set :config, config app.settings.set :config, config
app.settings.set :redis, redis app.settings.set :redis, redis
app.settings.set :metrics, metrics app.settings.set :metrics, metrics
app.settings.set :config, auth: false app.settings.set :config, auth: false
app.settings.set :checkoutlock, checkoutlock
create_token('abcdefghijklmnopqrstuvwxyz012345', 'jdoe', current_time) create_token('abcdefghijklmnopqrstuvwxyz012345', 'jdoe', current_time)
end end