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