Class: Gitlab::SidekiqMiddleware::SkipJobs

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/sidekiq_middleware/skip_jobs.rb

Defined Under Namespace

Classes: DatabaseHealthStatusChecker

Constant Summary collapse

DELAY =
ENV.fetch("SIDEKIQ_DEFER_JOBS_DELAY", 5.minutes)
RUN_FEATURE_FLAG_PREFIX =
"run_sidekiq_jobs"
DROP_FEATURE_FLAG_PREFIX =
"drop_sidekiq_jobs"
COUNTER =
:sidekiq_jobs_skipped_total

Instance Method Summary collapse

Constructor Details

#initializeSkipJobs

Returns a new instance of SkipJobs.



14
15
16
# File 'lib/gitlab/sidekiq_middleware/skip_jobs.rb', line 14

def initialize
  @metrics = init_metrics
end

Instance Method Details

#call(worker, job, _queue) ⇒ Object

This middleware decides whether a job is dropped, deferred or runs normally. In short:

- `drop_sidekiq_jobs_#{worker_name}` FF enabled (disabled by default) --> drops the job
- `run_sidekiq_jobs_#{worker_name}` FF disabled (enabled by default) --> defers the job

DROPPING JOBS A job is dropped when ‘drop_sidekiq_jobs_#worker_name` FF is enabled. This FF is disabled by default for all workers. Dropped jobs are completely ignored and not requeued for future processing.

DEFERRING JOBS Deferred jobs are rescheduled to perform in the future. There are 2 scenarios under which this middleware defers a job:

  1. When run_sidekiq_jobs_#worker_name FF is disabled. This FF is enabled by default for all workers.

  2. Gitlab::Database::HealthStatus, on evaluating the db health status if it returns any indicator with stop signal, the jobs will be delayed by ‘x’ seconds (set in worker).

Dropping jobs takes higher priority over deferring jobs. For example, when ‘drop_sidekiq_jobs` is enabled and `run_sidekiq_jobs` is disabled, it results to jobs being dropped.



37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/gitlab/sidekiq_middleware/skip_jobs.rb', line 37

def call(worker, job, _queue)
  # ActiveJobs have wrapped class stored in 'wrapped' key
  resolved_class = job['wrapped']&.safe_constantize || worker.class
  if drop_job?(resolved_class)
    # no-op, drop the job entirely
    drop_job!(job, worker)
    return
  elsif !!defer_job?(resolved_class, job)
    defer_job!(job, worker)
    return
  end

  yield
end