diff options
author | Stan Hu <stanhu@gmail.com> | 2019-07-10 15:37:59 -0700 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2019-07-10 15:42:36 -0700 |
commit | d5cdb223583de8055f03c820da3afc81091a4b50 (patch) | |
tree | c4fb7ceeffb6cbac7cc45a2f5b841a7bc82fc5e1 | |
parent | 2233e27b31b37d43ca8116ebc31a21dc09b190db (diff) | |
download | gitlab-ce-sh-disable-sidekiq-status-some-workers.tar.gz |
Disable setting of Sidekiq JID in Redis for some workerssh-disable-sidekiq-status-some-workers
In https://gitlab.com/gitlab-com/gl-infra/production/issues/939, we see
that the highest usage of Redis commands are from setting and deleting
the Sidekiq job ID from gitlab-sidekiq-status.
For most jobs, we don't need to store the job ID into Redis before
and after the job runs. We disable this on the most common workers to
reduce the load on Redis.
-rw-r--r-- | app/workers/build_finished_worker.rb | 4 | ||||
-rw-r--r-- | app/workers/build_queue_worker.rb | 4 | ||||
-rw-r--r-- | app/workers/concerns/application_worker.rb | 4 | ||||
-rw-r--r-- | app/workers/expire_pipeline_cache_worker.rb | 4 | ||||
-rw-r--r-- | app/workers/pipeline_process_worker.rb | 4 | ||||
-rw-r--r-- | app/workers/stage_update_worker.rb | 4 | ||||
-rw-r--r-- | app/workers/update_project_statistics_worker.rb | 4 | ||||
-rw-r--r-- | app/workers/web_hook_worker.rb | 4 | ||||
-rw-r--r-- | lib/gitlab/sidekiq_status/base_middleware.rb | 19 | ||||
-rw-r--r-- | lib/gitlab/sidekiq_status/client_middleware.rb | 5 | ||||
-rw-r--r-- | lib/gitlab/sidekiq_status/server_middleware.rb | 4 | ||||
-rw-r--r-- | spec/lib/gitlab/sidekiq_status/client_middleware_spec.rb | 7 | ||||
-rw-r--r-- | spec/lib/gitlab/sidekiq_status/server_middleware_spec.rb | 7 |
13 files changed, 70 insertions, 4 deletions
diff --git a/app/workers/build_finished_worker.rb b/app/workers/build_finished_worker.rb index 8e2a18a8fd8..2f09d4e14e8 100644 --- a/app/workers/build_finished_worker.rb +++ b/app/workers/build_finished_worker.rb @@ -6,6 +6,10 @@ class BuildFinishedWorker queue_namespace :pipeline_processing + def self.sidekiq_status_enabled? + false + end + # rubocop: disable CodeReuse/ActiveRecord def perform(build_id) Ci::Build.find_by(id: build_id).try do |build| diff --git a/app/workers/build_queue_worker.rb b/app/workers/build_queue_worker.rb index 67d5b0f5f5b..95a2f8fcfb7 100644 --- a/app/workers/build_queue_worker.rb +++ b/app/workers/build_queue_worker.rb @@ -6,6 +6,10 @@ class BuildQueueWorker queue_namespace :pipeline_processing + def self.sidekiq_status_enabled? + false + end + # rubocop: disable CodeReuse/ActiveRecord def perform(build_id) Ci::Build.find_by(id: build_id).try do |build| diff --git a/app/workers/concerns/application_worker.rb b/app/workers/concerns/application_worker.rb index 2b36ccb8304..ba902d2c469 100644 --- a/app/workers/concerns/application_worker.rb +++ b/app/workers/concerns/application_worker.rb @@ -64,5 +64,9 @@ module ApplicationWorker Sidekiq::Client.push_bulk('class' => self, 'args' => args_list, 'at' => schedule) end + + def sidekiq_status_enabled? + true + end end end diff --git a/app/workers/expire_pipeline_cache_worker.rb b/app/workers/expire_pipeline_cache_worker.rb index 78e68d7bf46..f135c4cccb9 100644 --- a/app/workers/expire_pipeline_cache_worker.rb +++ b/app/workers/expire_pipeline_cache_worker.rb @@ -6,6 +6,10 @@ class ExpirePipelineCacheWorker queue_namespace :pipeline_cache + def self.sidekiq_status_enabled? + false + end + # rubocop: disable CodeReuse/ActiveRecord def perform(pipeline_id) pipeline = Ci::Pipeline.find_by(id: pipeline_id) diff --git a/app/workers/pipeline_process_worker.rb b/app/workers/pipeline_process_worker.rb index f2aa17acb51..388a26cca74 100644 --- a/app/workers/pipeline_process_worker.rb +++ b/app/workers/pipeline_process_worker.rb @@ -6,6 +6,10 @@ class PipelineProcessWorker queue_namespace :pipeline_processing + def self.sidekiq_status_enabled? + false + end + # rubocop: disable CodeReuse/ActiveRecord def perform(pipeline_id) Ci::Pipeline.find_by(id: pipeline_id) diff --git a/app/workers/stage_update_worker.rb b/app/workers/stage_update_worker.rb index ea587789d03..c3f7429e155 100644 --- a/app/workers/stage_update_worker.rb +++ b/app/workers/stage_update_worker.rb @@ -6,6 +6,10 @@ class StageUpdateWorker queue_namespace :pipeline_processing + def self.sidekiq_status_enabled? + false + end + # rubocop: disable CodeReuse/ActiveRecord def perform(stage_id) Ci::Stage.find_by(id: stage_id).try do |stage| diff --git a/app/workers/update_project_statistics_worker.rb b/app/workers/update_project_statistics_worker.rb index 9a29cc12707..ef5a37707ac 100644 --- a/app/workers/update_project_statistics_worker.rb +++ b/app/workers/update_project_statistics_worker.rb @@ -5,6 +5,10 @@ class UpdateProjectStatisticsWorker include ApplicationWorker + def self.sidekiq_status_enabled? + false + end + # project_id - The ID of the project for which to flush the cache. # statistics - An Array containing columns from ProjectStatistics to # refresh, if empty all columns will be refreshed diff --git a/app/workers/web_hook_worker.rb b/app/workers/web_hook_worker.rb index 09219a24a16..1dfcb45a8ea 100644 --- a/app/workers/web_hook_worker.rb +++ b/app/workers/web_hook_worker.rb @@ -5,6 +5,10 @@ class WebHookWorker sidekiq_options retry: 4, dead: false + def self.sidekiq_status_enabled? + false + end + def perform(hook_id, data, hook_name) hook = WebHook.find(hook_id) data = data.with_indifferent_access diff --git a/lib/gitlab/sidekiq_status/base_middleware.rb b/lib/gitlab/sidekiq_status/base_middleware.rb new file mode 100644 index 00000000000..3682122e3d5 --- /dev/null +++ b/lib/gitlab/sidekiq_status/base_middleware.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Gitlab + module SidekiqStatus + class BaseMiddleware + # @param [Hash] job the full job payload + def status_enabled?(job) + worker = job['class']&.constantize + + byebug + return worker.sidekiq_status_enabled? if worker&.respond_to?(:sidekiq_status_enabled?) + + true + rescue NameError + true + end + end + end +end diff --git a/lib/gitlab/sidekiq_status/client_middleware.rb b/lib/gitlab/sidekiq_status/client_middleware.rb index bfd5038557d..b69d84531f0 100644 --- a/lib/gitlab/sidekiq_status/client_middleware.rb +++ b/lib/gitlab/sidekiq_status/client_middleware.rb @@ -2,11 +2,12 @@ module Gitlab module SidekiqStatus - class ClientMiddleware + class ClientMiddleware < BaseMiddleware def call(_, job, _, _) status_expiration = job['status_expiration'] || Gitlab::SidekiqStatus::DEFAULT_EXPIRATION - Gitlab::SidekiqStatus.set(job['jid'], status_expiration) + Gitlab::SidekiqStatus.set(job['jid'], status_expiration) if status_enabled?(job) + yield end end diff --git a/lib/gitlab/sidekiq_status/server_middleware.rb b/lib/gitlab/sidekiq_status/server_middleware.rb index 01bc58fd2be..7a2ae99d155 100644 --- a/lib/gitlab/sidekiq_status/server_middleware.rb +++ b/lib/gitlab/sidekiq_status/server_middleware.rb @@ -2,11 +2,11 @@ module Gitlab module SidekiqStatus - class ServerMiddleware + class ServerMiddleware < BaseMiddleware def call(worker, job, queue) ret = yield - Gitlab::SidekiqStatus.unset(job['jid']) + Gitlab::SidekiqStatus.unset(job['jid']) if status_enabled?(job) ret end diff --git a/spec/lib/gitlab/sidekiq_status/client_middleware_spec.rb b/spec/lib/gitlab/sidekiq_status/client_middleware_spec.rb index 37d9e1d3e6b..bc2f0eddcb6 100644 --- a/spec/lib/gitlab/sidekiq_status/client_middleware_spec.rb +++ b/spec/lib/gitlab/sidekiq_status/client_middleware_spec.rb @@ -8,5 +8,12 @@ describe Gitlab::SidekiqStatus::ClientMiddleware do described_class.new .call('Foo', { 'jid' => '123' }, double(:queue), double(:pool)) { nil } end + + it 'does not track the job in Redis for excluded jobs' do + expect(Gitlab::SidekiqStatus).not_to receive(:set) + + described_class.new + .call('BuildQueueWorker', { 'class' => 'BuildQueueWorker', 'jid' => '123' }, double(:queue), double(:pool)) { nil } + end end end diff --git a/spec/lib/gitlab/sidekiq_status/server_middleware_spec.rb b/spec/lib/gitlab/sidekiq_status/server_middleware_spec.rb index 04e09d3dec8..379b39958df 100644 --- a/spec/lib/gitlab/sidekiq_status/server_middleware_spec.rb +++ b/spec/lib/gitlab/sidekiq_status/server_middleware_spec.rb @@ -10,5 +10,12 @@ describe Gitlab::SidekiqStatus::ServerMiddleware do expect(ret).to eq(10) end + + it 'does not track the job in Redis for excluded jobs' do + expect(Gitlab::SidekiqStatus).not_to receive(:unset) + + described_class.new + .call(double(:worker), { 'class' => 'BuildQueueWorker', 'jid' => '123' }, double(:queue)) { 10 } + end end end |