diff --git a/app/workers/geo_bulk_notify_worker.rb b/app/workers/geo_bulk_notify_worker.rb index a58ffc1a826f9e10edcd8109d17bb274d3ee48b0..0ba67af964882f37530e0aba76d8612a12d3badb 100644 --- a/app/workers/geo_bulk_notify_worker.rb +++ b/app/workers/geo_bulk_notify_worker.rb @@ -2,7 +2,20 @@ class GeoBulkNotifyWorker include Sidekiq::Worker include CronjobQueue + # This crontab entry fires every 10 minutes, so choose a time less than that + # to handle any time differences between Sidekiq workers + LEASE_TIMEOUT = 2.minutes + def perform + return unless try_obtain_lease + Geo::NotifyNodesService.new.execute end + + private + + def try_obtain_lease + lease = ::Gitlab::ExclusiveLease.new("geo_bulk_notify_worker", timeout: LEASE_TIMEOUT) + lease.try_obtain + end end diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 3df5794ddc02548dcda84c01991fe837c4bfdbee..16cb830f1cfa68a851d3fee83baae2f9e4075eb3 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -376,7 +376,7 @@ def cron_random_weekly_time Settings.cron_jobs['ldap_group_sync_worker']['cron'] ||= '0 * * * *' Settings.cron_jobs['ldap_group_sync_worker']['job_class'] = 'LdapGroupSyncWorker' Settings.cron_jobs['geo_bulk_notify_worker'] ||= Settingslogic.new({}) -Settings.cron_jobs['geo_bulk_notify_worker']['cron'] ||= '*/10 * * * * *' +Settings.cron_jobs['geo_bulk_notify_worker']['cron'] ||= '*/10 * * * *' Settings.cron_jobs['geo_bulk_notify_worker']['job_class'] ||= 'GeoBulkNotifyWorker' Settings.cron_jobs['gitlab_usage_ping_worker'] ||= Settingslogic.new({}) Settings.cron_jobs['gitlab_usage_ping_worker']['cron'] ||= Settings.send(:cron_random_weekly_time) diff --git a/spec/workers/geo_bulk_notify_worker_spec.rb b/spec/workers/geo_bulk_notify_worker_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..73867fadbd10dbab506b4652203afd8a7ae77d1f --- /dev/null +++ b/spec/workers/geo_bulk_notify_worker_spec.rb @@ -0,0 +1,21 @@ +require 'rails_helper' + +describe GeoBulkNotifyWorker do + describe '#perform' do + it 'executes Geo::NotifyNodesService if can obtain a lease' do + allow_any_instance_of(Gitlab::ExclusiveLease) + .to receive(:try_obtain).and_return(true) + expect_any_instance_of(Geo::NotifyNodesService).to receive(:execute) + + described_class.new.perform + end + + it 'just returns if cannot obtain a lease' do + allow_any_instance_of(Gitlab::ExclusiveLease) + .to receive(:try_obtain).and_return(false) + expect_any_instance_of(Geo::NotifyNodesService).not_to receive(:execute) + + described_class.new.perform + end + end +end