Avoid backfill worker to stuck when clone take longer than run time

[ci skip]
parent 0cf48d8f
module Geo module Geo
class RepositoryBackfillService class RepositoryBackfillService
attr_reader :project attr_reader :project, :backfill_lease
LEASE_TIMEOUT = 8.hours.freeze LEASE_TIMEOUT = 8.hours.freeze
LEASE_KEY_PREFIX = 'repository_backfill_service'.freeze
def initialize(project) def initialize(project_id, backfill_lease)
@project = project @project = Project.find(project_id)
@backfill_lease = backfill_lease
end end
def execute def execute
...@@ -16,7 +18,6 @@ module Geo ...@@ -16,7 +18,6 @@ module Geo
registry.last_repository_synced_at = started_at registry.last_repository_synced_at = started_at
registry.last_repository_successful_sync_at = finished_at if finished_at registry.last_repository_successful_sync_at = finished_at if finished_at
registry.save registry.save
log('Finished repository sync') log('Finished repository sync')
end end
end end
...@@ -58,22 +59,19 @@ module Geo ...@@ -58,22 +59,19 @@ module Geo
def try_obtain_lease def try_obtain_lease
log('Trying to obtain lease to sync repository') log('Trying to obtain lease to sync repository')
uuid = Gitlab::ExclusiveLease.new(lease_key, timeout: LEASE_TIMEOUT).try_obtain repository_lease = Gitlab::ExclusiveLease.new(lease_key, timeout: LEASE_TIMEOUT).try_obtain
log('Could not obtain lease to sync repository') and return unless uuid log('Could not obtain lease to sync repository') and return unless repository_lease
yield yield
log('Releasing lease to sync repository') log('Releasing leases to sync repository')
release_lease(uuid) Gitlab::ExclusiveLease.cancel(lease_key, repository_lease)
end Gitlab::ExclusiveLease.cancel(LEASE_KEY_PREFIX, backfill_lease)
def release_lease(uuid)
Gitlab::ExclusiveLease.cancel(lease_key, uuid)
end end
def lease_key def lease_key
@key ||= "repository_backfill_service:#{project.id}" @key ||= "#{LEASE_KEY_PREFIX}:#{project.id}"
end end
def primary_ssh_path_prefix def primary_ssh_path_prefix
......
...@@ -2,8 +2,7 @@ class GeoBackfillWorker ...@@ -2,8 +2,7 @@ class GeoBackfillWorker
include Sidekiq::Worker include Sidekiq::Worker
include CronjobQueue include CronjobQueue
LEASE_TIMEOUT = 8.hours.freeze RUN_TIME = 5.minutes.to_i.freeze
RUN_TIME = 5.minutes.to_i.freeze
def perform def perform
start = Time.now start = Time.now
...@@ -18,8 +17,8 @@ class GeoBackfillWorker ...@@ -18,8 +17,8 @@ class GeoBackfillWorker
project = Project.find(project_id) project = Project.find(project_id)
next if project.repository_exists? next if project.repository_exists?
try_obtain_lease do try_obtain_lease do |lease|
Geo::RepositoryBackfillService.new(project).execute GeoSingleRepositoryBackfillWorker.new.perform(project_id, lease)
end end
end end
...@@ -37,21 +36,19 @@ class GeoBackfillWorker ...@@ -37,21 +36,19 @@ class GeoBackfillWorker
end end
def try_obtain_lease def try_obtain_lease
uuid = Gitlab::ExclusiveLease.new(lease_key, timeout: LEASE_TIMEOUT).try_obtain lease = Gitlab::ExclusiveLease.new(lease_key, timeout: LEASE_TIMEOUT).try_obtain
return unless uuid return unless lease
yield yield lease
release_lease(uuid)
end end
def release_lease(uuid) def lease_key
Gitlab::ExclusiveLease.cancel(lease_key, uuid) Geo::RepositoryBackfillService::LEASE_KEY_PREFIX
end end
def lease_key def lease_timeout
'repository_backfill_service' Geo::RepositoryBackfillService::LEASE_TIMEOUT
end end
def node_enabled? def node_enabled?
......
class GeoSingleRepositoryBackfillWorker
include Sidekiq::Worker
include ::GeoDynamicBackoff
include GeoQueue
def perform(project_id, lease)
Geo::RepositoryBackfillService.new(project_id, lease).execute
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment