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