Class: Gitlab::SidekiqMiddleware::SkipJobs
- Inherits:
-
Object
- Object
- Gitlab::SidekiqMiddleware::SkipJobs
- 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
-
#call(worker, job, _queue) ⇒ Object
This middleware decides whether a job is dropped, deferred or runs normally.
-
#initialize ⇒ SkipJobs
constructor
A new instance of SkipJobs.
Constructor Details
#initialize ⇒ SkipJobs
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:
-
When run_sidekiq_jobs_#worker_name FF is disabled. This FF is enabled by default for all workers.
-
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 |