summaryrefslogtreecommitdiff
path: root/app/workers
diff options
context:
space:
mode:
authorNick Thomas <nick@gitlab.com>2017-11-28 12:46:39 +0000
committerNick Thomas <nick@gitlab.com>2017-11-28 12:46:39 +0000
commit0185d7800b23daecd44abe8e9a0b2672a831e8be (patch)
treeaf69f53cbc9842246dd5c67f0985aaea69cbc40a /app/workers
parent85ff313a1ecf3fc0ffbf1989533d4fa38bd8daf8 (diff)
parent58f32622ce9c2d08001da7b91065942cdc5a0f4a (diff)
downloadgitlab-ce-0185d7800b23daecd44abe8e9a0b2672a831e8be.tar.gz
Merge branch 'hashed-storage-attachments-migration-path' into 'master'
Hashed storage attachments migration path See merge request gitlab-org/gitlab-ce!15352
Diffstat (limited to 'app/workers')
-rw-r--r--app/workers/project_migrate_hashed_storage_worker.rb26
1 files changed, 25 insertions, 1 deletions
diff --git a/app/workers/project_migrate_hashed_storage_worker.rb b/app/workers/project_migrate_hashed_storage_worker.rb
index ca276d7801c..127aa6b9d7d 100644
--- a/app/workers/project_migrate_hashed_storage_worker.rb
+++ b/app/workers/project_migrate_hashed_storage_worker.rb
@@ -2,10 +2,34 @@ class ProjectMigrateHashedStorageWorker
include Sidekiq::Worker
include DedicatedSidekiqQueue
+ LEASE_TIMEOUT = 30.seconds.to_i
+
def perform(project_id)
project = Project.find_by(id: project_id)
return if project.nil? || project.pending_delete?
- ::Projects::HashedStorageMigrationService.new(project, logger).execute
+ uuid = lease_for(project_id).try_obtain
+ if uuid
+ ::Projects::HashedStorageMigrationService.new(project, logger).execute
+ else
+ false
+ end
+ rescue => ex
+ cancel_lease_for(project_id, uuid) if uuid
+ raise ex
+ end
+
+ def lease_for(project_id)
+ Gitlab::ExclusiveLease.new(lease_key(project_id), timeout: LEASE_TIMEOUT)
+ end
+
+ private
+
+ def lease_key(project_id)
+ "project_migrate_hashed_storage_worker:#{project_id}"
+ end
+
+ def cancel_lease_for(project_id, uuid)
+ Gitlab::ExclusiveLease.cancel(lease_key(project_id), uuid)
end
end