class Sidekiq::Deploy
Constants
- LABEL_MAKER
- MARK_TTL
Public Class Methods
mark!(label = nil)
click to toggle source
# File lib/sidekiq/deploy.rb, line 25 def self.mark!(label = nil) Sidekiq::Deploy.new.mark!(label: label) end
new(pool = Sidekiq::RedisConnection.create)
click to toggle source
# File lib/sidekiq/deploy.rb, line 29 def initialize(pool = Sidekiq::RedisConnection.create) @pool = pool end
Public Instance Methods
fetch(date = Time.now.utc.to_date)
click to toggle source
# File lib/sidekiq/deploy.rb, line 59 def fetch(date = Time.now.utc.to_date) datecode = date.strftime("%Y%m%d") @pool.with { |c| c.hgetall("#{datecode}-marks") } end
mark!(at: Time.now, label: nil)
click to toggle source
# File lib/sidekiq/deploy.rb, line 33 def mark!(at: Time.now, label: nil) label ||= LABEL_MAKER.call # we need to round the timestamp so that we gracefully # handle an very common error in marking deploys: # having every process mark its deploy, leading # to N marks for each deploy. Instead we round the time # to the minute so that multiple marks within that minute # will all naturally rollup into one mark per minute. whence = at.utc floor = Time.utc(whence.year, whence.month, whence.mday, whence.hour, whence.min, 0) datecode = floor.strftime("%Y%m%d") key = "#{datecode}-marks" stamp = floor.iso8601 @pool.with do |c| # only allow one deploy mark for a given label for the next minute lock = c.set("deploylock-#{label}", stamp, "nx", "ex", "60") if lock c.multi do |pipe| pipe.hsetnx(key, stamp, label) pipe.expire(key, MARK_TTL) end end end end