Simplify cacher

This commit is contained in:
Chris Roberts 2022-02-17 15:47:30 -08:00 committed by Paul Hinze
parent d82702064f
commit b976be72bd
No known key found for this signature in database
GPG Key ID: B69DEDF2D55501C0
5 changed files with 23 additions and 79 deletions

View File

@ -32,10 +32,10 @@ module VagrantPlugins
def converter(proto, broker, cacher)
cid = proto.addr.to_s if proto.addr.to_s != ""
return cacher[cid].value if cid && cacher.registered?(cid)
return cacher.get(cid) if cid && cacher.registered?(cid)
project = Client::Basis.load(proto, broker: broker)
cacher[cid] = project if cid
cacher.register(cid, project) if cid
project
end
end

View File

@ -15,10 +15,10 @@ module VagrantPlugins
def converter(project, ui, cacher)
cid = project.resource_id
return cacher[cid].value if cacher.registered?(cid)
return cacher.get(cid) if cacher.registered?(cid)
logger.warn("cache miss for environment with project resource id #{cid} cache=#{cacher} !!")
env = Vagrant::Environment.new(ui: ui, client: project)
cacher[cid] = env
cacher.register(cid, env)
env
end
end
@ -65,11 +65,11 @@ module VagrantPlugins
def converter(project, cacher, mapper)
cid = project.resource_id
return cacher[cid].value if cacher.registered?(cid)
return cacher.get(cid) if cacher.registered?(cid)
logger.warn("cache miss for environment with project resource id #{cid} cache=#{cacher}")
ui = mapper.map(project, to: Vagrant::UI::Remote)
env = Vagrant::Environment.new(client: project, ui: ui)
cacher[cid] = env
cacher.register(cid, env)
env
end
end

View File

@ -50,10 +50,10 @@ module VagrantPlugins
def converter(proto, broker, cacher)
cid = proto.addr.to_s if proto.addr.to_s != ""
return cacher[cid].value if cid && cacher.registered?(cid)
return cacher.get(cid) if cid && cacher.registered?(cid)
project = Client::Project.load(proto, broker: broker)
cacher[cid] = project if cid
cacher.register(cid, project) if cid
project
end
end

View File

@ -5,7 +5,7 @@ module VagrantPlugins
class SyncedFolderProtoFromInstance < Mapper
def initialize
inputs = [].tap do |i|
i << Input.new(type: Vagrant::Plugin::V2::SyncedFolder)
i << Input.new(type: Vagrant::Plugin::Remote::SyncedFolder)
end
super(inputs: inputs, output: SDK::Args::SyncedFolder, func: method(:converter))
end
@ -42,11 +42,11 @@ module VagrantPlugins
def converter(proto, broker, cacher)
cid = proto.addr.to_s if proto.addr.to_s != ""
return cacher[cid].value if cid && cacher.registered?(cid)
return cacher.get(cid) if cid && cacher.registered?(cid)
project = Client::SyncedFolder.load(proto, broker: broker)
cacher[cid] = project if cid
project
sf = Client::SyncedFolder.load(proto, broker: broker)
cacher.register(cid, sf) if cid
sf
end
end
@ -56,7 +56,7 @@ module VagrantPlugins
inputs = [].tap do |i|
i << Input.new(type: Client::SyncedFolder)
end
super(inputs: inputs, output: Vagrant::Plugin::V2::SyncedFolder, func: method(:converter))
super(inputs: inputs, output: Vagrant::Plugin::Remote::SyncedFolder, func: method(:converter))
end
def converter(client)

View File

@ -1,91 +1,35 @@
require "mutex_m"
module VagrantPlugins
module CommandServe
module Util
class Cacher
include Mutex_m
class Entry
attr_reader :value
def initialize(value)
super()
@value = value
end
def value
@value
end
end
def initialize
super()
@registry = {}
end
def registered?(key)
mu_synchronize { @registry.key?(key) }
@registry.key?(key)
end
def []=(key, value)
entry = Entry.new(value)
mu_synchronize { @registry[key] = entry }
def register(key, value)
@registry[key] = value
end
def [](key)
mu_synchronize { @registry[key] }
def get(key)
@registry[key]
end
def delete(key)
entry = @registry[key]
return if entry.nil?
entry.mu_synchronize do
value = entry.value
@registry.delete(key)
value
end
def unregister(key)
@registry.delete(key)
end
# TODO: need to add a lock/unlock for an entry so
# we can "check it out" for use during a request
# and then return it without needing to deal with
# block wrapping to maintain the lock.
def use(key)
entry = self[key]
if entry.nil?
if !@registry.key?(key)
raise KeyError,
"No value cached with key `#{key}'"
end
entry.mu_synchronize do
yield entry.value
end
end
def checkout(key, wait: false)
entry = self[key]
if entry.nil?
raise KeyError,
"No value cached with key `#{key}'"
end
if wait
entry.mu_lock
entry.value
else
if !entry.mu_try_lock
raise LockError,
"Failed to lock cached entry with key `#{key}'"
end
entry.value
end
end
def checkin(key)
entry = self[key]
return if entry.nil?
entry.mu_unlock
nil
yield @registry[key]
end
end
end