mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-26 01:58:41 -05:00
(POOLER-150) Synchronize checkout operations for API
This commit adds a shared mutex to vmpooler API so that checkout requests can be synchronized across threads. Without this change it is possible in some scenarios for vmpooler to allocate the same SUT to different API requests for a VM.
This commit is contained in:
parent
79bd140ab9
commit
30bf2074fe
6 changed files with 27 additions and 14 deletions
|
|
@ -36,10 +36,11 @@ module Vmpooler
|
|||
use Vmpooler::API::Reroute
|
||||
use Vmpooler::API::V1
|
||||
|
||||
def configure(config, redis, metrics)
|
||||
def configure(config, redis, metrics, checkoutlock)
|
||||
self.settings.set :config, config
|
||||
self.settings.set :redis, redis
|
||||
self.settings.set :metrics, metrics
|
||||
self.settings.set :checkoutlock, checkoutlock
|
||||
end
|
||||
|
||||
def execute!
|
||||
|
|
|
|||
|
|
@ -36,6 +36,10 @@ module Vmpooler
|
|||
validate_token(backend)
|
||||
end
|
||||
|
||||
def checkoutlock
|
||||
Vmpooler::API::settings.checkoutlock
|
||||
end
|
||||
|
||||
def fetch_single_vm(template)
|
||||
template_backends = [template]
|
||||
aliases = Vmpooler::API.settings.config[:alias]
|
||||
|
|
@ -67,21 +71,23 @@ module Vmpooler
|
|||
end
|
||||
end
|
||||
|
||||
template_backends.each do |template_backend|
|
||||
vms = backend.smembers("vmpooler__ready__#{template_backend}")
|
||||
next if vms.empty?
|
||||
vms.reverse.each do |vm|
|
||||
ready = vm_ready?(vm, config['domain'])
|
||||
if ready
|
||||
backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__running__#{template_backend}", vm)
|
||||
return [vm, template_backend, template]
|
||||
else
|
||||
backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__completed__#{template_backend}", vm)
|
||||
metrics.increment("checkout.nonresponsive.#{template_backend}")
|
||||
checkoutlock.synchronize do
|
||||
template_backends.each do |template_backend|
|
||||
vms = backend.smembers("vmpooler__ready__#{template_backend}")
|
||||
next if vms.empty?
|
||||
vms.reverse.each do |vm|
|
||||
ready = vm_ready?(vm, config['domain'])
|
||||
if ready
|
||||
backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__running__#{template_backend}", vm)
|
||||
return [vm, template_backend, template]
|
||||
else
|
||||
backend.smove("vmpooler__ready__#{template_backend}", "vmpooler__completed__#{template_backend}", vm)
|
||||
metrics.increment("checkout.nonresponsive.#{template_backend}")
|
||||
end
|
||||
end
|
||||
end
|
||||
[nil, nil, nil]
|
||||
end
|
||||
[nil, nil, nil]
|
||||
end
|
||||
|
||||
def return_vm_to_ready_state(template, vm)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue