Module: SidekiqUniqueJobs::Orphans::Manager

Defined in:
lib/sidekiq_unique_jobs/orphans/manager.rb

Overview

Manages the orphan reaper

Author:

Constant Summary collapse

DRIFT_FACTOR =
0.02
REAPERS =
[:ruby, :lua].freeze

Class Method Summary collapse

Class Method Details

.current_timestampObject



202
203
204
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 202

def current_timestamp
  Time.now.to_i
end

.disabled?true, false

Checks if reaping is disabled

Returns:

  • (true, false)

See Also:



155
156
157
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 155

def disabled?
  !enabled?
end

.drift_reaper_intervalObject



198
199
200
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 198

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

.enabled?true, false

Checks if reaping is enabled

Returns:

  • (true, false)


164
165
166
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 164

def enabled?
  REAPERS.include?(reaper)
end

.logging_contextHash, String

A context to use for all log entries

Returns:

  • (Hash)

    when logger responds to ‘:with_context`

  • (String)

    when logger does not responds to ‘:with_context`



117
118
119
120
121
122
123
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 117

def logging_context
  if logger_context_hash?
    { "uniquejobs" => "reaper" }
  else
    "uniquejobs=orphan-reaper"
  end
end

.reaperObject

See Also:

  • Config#reaper


92
93
94
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 92

def reaper
  SidekiqUniqueJobs.config.reaper
end

.reaper_intervalObject

See Also:

  • Config#reaper_interval


99
100
101
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 99

def reaper_interval
  SidekiqUniqueJobs.config.reaper_interval
end

.reaper_timeoutObject

See Also:

  • Config#reaper_timeout


106
107
108
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 106

def reaper_timeout
  SidekiqUniqueJobs.config.reaper_timeout
end

.refresh_reaper_mutexvoid

This method returns an undefined value.

Updates mutex key



184
185
186
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 184

def refresh_reaper_mutex
  redis { |conn| conn.set(UNIQUE_REAPER, current_timestamp, ex: drift_reaper_interval) }
end

.register_reaper_processvoid

This method returns an undefined value.

Writes a mutex key to redis



174
175
176
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 174

def register_reaper_process
  redis { |conn| conn.set(UNIQUE_REAPER, current_timestamp, nx: true, ex: drift_reaper_interval) }
end

.registered?true, false

Checks if a reaper is registered

Returns:

  • (true, false)


131
132
133
134
135
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 131

def registered?
  redis do |conn|
    conn.get(UNIQUE_REAPER).to_i + drift_reaper_interval > current_timestamp
  end
end

.startConcurrent::TimerTask

Starts a separate thread that periodically reaps orphans

Returns:

  • (Concurrent::TimerTask)

    the task that was started



25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 25

def start # rubocop:disable
  return if disabled?
  return if registered?

  with_logging_context do
    register_reaper_process
    log_info("Starting Reaper")
    task.add_observer(Observer.new)
    task.execute
    task
  end
end

.stopBoolean

Stops the thread that reaps orphans

Returns:

  • (Boolean)


44
45
46
47
48
49
50
51
52
53
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 44

def stop
  return if disabled?
  return if unregistered?

  with_logging_context do
    log_info("Stopping Reaper")
    unregister_reaper_process
    task.shutdown
  end
end

.task<type>

The task that runs the reaper

Returns:

  • (<type>)

    <description>



61
62
63
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 61

def task
  @task ||= Concurrent::TimerTask.new(timer_task_options, &task_body)
end

.task_bodyObject



66
67
68
69
70
71
72
73
74
75
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 66

def task_body
  @task_body ||= lambda do
    with_logging_context do
      redis do |conn|
        refresh_reaper_mutex
        Orphans::Reaper.call(conn)
      end
    end
  end
end

.timer_task_optionsHash

Arguments passed on to the timer task

Returns:



83
84
85
86
87
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 83

def timer_task_options
  { run_now: true,
    execution_interval: reaper_interval,
    timeout_interval: reaper_timeout }
end

.unregister_reaper_processvoid

This method returns an undefined value.

Removes mutex key from redis



194
195
196
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 194

def unregister_reaper_process
  redis { |conn| conn.del(UNIQUE_REAPER) }
end

.unregistered?true, false

Checks if that reapers are not registerd

Returns:

  • (true, false)

See Also:



144
145
146
# File 'lib/sidekiq_unique_jobs/orphans/manager.rb', line 144

def unregistered?
  !registered?
end