module SidekiqUniqueJobs::Orphans::ReaperResurrector

def current_timestamp

def current_timestamp
  Time.now.to_i
end

def drift_reaper_interval

def drift_reaper_interval
  reaper_interval + (reaper_interval * DRIFT_FACTOR).to_i
end

def logging_context

Returns:
  • (String) - when logger does not responds to `:with_context`
  • (Hash) - when logger responds to `:with_context`
def logging_context
  if logger_context_hash?
    { "uniquejobs" => "reaper-resurrector" }
  else
    "uniquejobs=reaper-resurrector"
  end
end

def orphans_manager

Returns:
  • (SidekiqUniqueJobs::Orphans::Manager) -
def orphans_manager
  SidekiqUniqueJobs::Orphans::Manager
end

def reaper

Other tags:
    See: SidekiqUniqueJobs::Config#reaper -
def reaper
  SidekiqUniqueJobs.config.reaper
end

def reaper_disabled?

Returns:
  • (true, false) -

Other tags:
    See: reaper_enabled? -
def reaper_disabled?
  !reaper_enabled?
end

def reaper_enabled?

Returns:
  • (true, false) -
def reaper_enabled?
  REAPERS.include?(reaper)
end

def reaper_interval

def reaper_interval
  SidekiqUniqueJobs.config.reaper_interval
end

def reaper_registered?

Returns:
  • (true, false) -
def reaper_registered?
  redis do |conn|
    conn.get(UNIQUE_REAPER).to_i + drift_reaper_interval > current_timestamp
  end
end

def reaper_resurrector_interval

Other tags:
    See: SidekiqUniqueJobs::Config#reaper_resurrector_interval -
def reaper_resurrector_interval
  SidekiqUniqueJobs.config.reaper_resurrector_interval
end

def restart_if_dead


Starts new instance of orphan reaper if reaper is considered dead (reaper mutex has not been refreshed lately)
def restart_if_dead
  return if reaper_registered?
  log_info("Reaper is considered dead. Starting new reaper instance")
  orphans_manager.start
end

def resurrector_disabled?

Returns:
  • (true, false) -

Other tags:
    See: resurrector_enabled? -
def resurrector_disabled?
  !resurrector_enabled?
end

def resurrector_enabled?

Returns:
  • (true, false) -
def resurrector_enabled?
  SidekiqUniqueJobs.config.reaper_resurrector_enabled
end

def run_task

Returns:
  • (SidekiqUniqueJobs::TimerTask) -
def run_task
  log_info("Starting Reaper Resurrector")
  task.execute
  task
end

def start

Returns:
  • (SidekiqUniqueJobs::TimerTask) - the task that was started
def start
  return if resurrector_disabled?
  return if reaper_disabled?
  with_logging_context do
    run_task
  end
end

def task

Returns:
  • (SidekiqUniqueJobs::TimerTask) -
def task
  SidekiqUniqueJobs::TimerTask.new(timer_task_options) do
    with_logging_context do
      restart_if_dead
    end
  end
end

def timer_task_options

Returns:
  • (Hash) -
def timer_task_options
  { run_now: false,
    execution_interval: reaper_resurrector_interval }
end