class Sidekiq::Deploy

def self.mark!(label = nil)

def self.mark!(label = nil)
  Sidekiq::Deploy.new.mark!(label: label)
end

def fetch(date = Time.now.utc.to_date)

def fetch(date = Time.now.utc.to_date)
  datecode = date.strftime("%Y%m%d")
  @pool.with { |c| c.hgetall("#{datecode}-marks") }
end

def initialize(pool = Sidekiq::RedisConnection.create)

def initialize(pool = Sidekiq::RedisConnection.create)
  @pool = pool
end

def mark!(at: Time.now, label: nil)

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