class Makara::Context
Attributes
current_timestamp[R]
staged_data[RW]
stored_data[RW]
Public Class Methods
new(context_data)
click to toggle source
# File lib/makara/context.rb, line 9 def initialize(context_data) @stored_data = context_data @staged_data = {} @dirty = @was_dirty = false freeze_time end
Protected Class Methods
current()
click to toggle source
# File lib/makara/context.rb, line 127 def current fetch(:makara_current_context) { new({}) } end
fetch(key) { || ... }
click to toggle source
# File lib/makara/context.rb, line 131 def fetch(key) get(key) || set(key, yield) end
get(key)
click to toggle source
# File lib/makara/context.rb, line 136 def get(key) Thread.current.thread_variable_get(key) end
set(key, value)
click to toggle source
# File lib/makara/context.rb, line 140 def set(key, value) Thread.current.thread_variable_set(key, value) end
Private Class Methods
next()
click to toggle source
# File lib/makara/context.rb, line 111 def next if current.commit current.stored_data end end
release(proxy_id)
click to toggle source
# File lib/makara/context.rb, line 117 def release(proxy_id) current.release(proxy_id) end
release_all()
click to toggle source
# File lib/makara/context.rb, line 121 def release_all current.release_all end
set_current(context_data)
click to toggle source
# File lib/makara/context.rb, line 98 def set_current(context_data) set(:makara_current_context, new(context_data)) end
stick(proxy_id, ttl)
click to toggle source
Called by `Proxy#stick_to_master!` to use master in subsequent requests
# File lib/makara/context.rb, line 103 def stick(proxy_id, ttl) current.stage(proxy_id, ttl) end
stuck?(proxy_id)
click to toggle source
# File lib/makara/context.rb, line 107 def stuck?(proxy_id) current.staged?(proxy_id) || current.stuck?(proxy_id) end
Public Instance Methods
commit()
click to toggle source
Stores the staged data with an expiration time based on the current time, and clears any expired entries. Returns true if any changes were made to the current store
# File lib/makara/context.rb, line 47 def commit freeze_time release_expired store_staged_data clean was_dirty? end
release(proxy_id)
click to toggle source
# File lib/makara/context.rb, line 29 def release(proxy_id) @dirty ||= !!stored_data.delete(proxy_id) staged_data.delete(proxy_id) end
release_all()
click to toggle source
# File lib/makara/context.rb, line 34 def release_all if self.stored_data.any? self.stored_data = {} # We need to track a change made to the current stored data # so we can commit it later @dirty = true end self.staged_data = {} end
stage(proxy_id, ttl)
click to toggle source
# File lib/makara/context.rb, line 17 def stage(proxy_id, ttl) staged_data[proxy_id] = [staged_data[proxy_id].to_f, ttl.to_f].max end
staged?(proxy_id)
click to toggle source
# File lib/makara/context.rb, line 25 def staged?(proxy_id) staged_data.key?(proxy_id) end
stuck?(proxy_id)
click to toggle source
# File lib/makara/context.rb, line 21 def stuck?(proxy_id) stored_data[proxy_id] && !expired?(stored_data[proxy_id]) end
Private Instance Methods
clean()
click to toggle source
# File lib/makara/context.rb, line 91 def clean @was_dirty = dirty? @dirty = false @staged_data = {} end
dirty?()
click to toggle source
Indicates whether there have been changes to the context that need to be persisted when the request finishes
# File lib/makara/context.rb, line 64 def dirty? @dirty end
expired?(timestamp)
click to toggle source
# File lib/makara/context.rb, line 72 def expired?(timestamp) timestamp <= current_timestamp end
freeze_time()
click to toggle source
# File lib/makara/context.rb, line 58 def freeze_time @current_timestamp = Time.now.to_f end
release_expired()
click to toggle source
# File lib/makara/context.rb, line 76 def release_expired previous_size = stored_data.size stored_data.delete_if { |_, timestamp| expired?(timestamp) } @dirty ||= previous_size != stored_data.size end
store_staged_data()
click to toggle source
# File lib/makara/context.rb, line 82 def store_staged_data staged_data.each do |proxy_id, ttl| if ttl > 0 && self.stored_data[proxy_id].to_f < current_timestamp + ttl self.stored_data[proxy_id] = current_timestamp + ttl @dirty = true end end end
was_dirty?()
click to toggle source
# File lib/makara/context.rb, line 68 def was_dirty? @was_dirty end