summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Mazetto <brodock@gmail.com>2018-03-09 09:15:30 +0100
committerGabriel Mazetto <brodock@gmail.com>2018-03-09 09:15:30 +0100
commit08afe1504dccdec9fb588905278142f699787c12 (patch)
treeefe0106472233f6e46103cf665049273401b687d
parent2611eafab3a3d27bd5a957c0525fc597690b6611 (diff)
downloadgitlab-ce-gitlab-ee-4910-exclusive-lease.tar.gz
Add scope to ExclusiveLease clear and document the rake taskgitlab-ee-4910-exclusive-lease
-rw-r--r--doc/administration/raketasks/maintenance.md28
-rw-r--r--lib/gitlab/exclusive_lease.rb4
-rw-r--r--lib/tasks/gitlab/exclusive_lease.rake6
3 files changed, 33 insertions, 5 deletions
diff --git a/doc/administration/raketasks/maintenance.md b/doc/administration/raketasks/maintenance.md
index ecf92c379fd..2b4252a7b1d 100644
--- a/doc/administration/raketasks/maintenance.md
+++ b/doc/administration/raketasks/maintenance.md
@@ -240,3 +240,31 @@ sudo gitlab-rake gitlab:tcp_check[example.com,80]
cd /home/git/gitlab
sudo -u git -H bundle exec rake gitlab:tcp_check[example.com,80] RAILS_ENV=production
```
+
+## Clear exclusive lease (DANGER)
+
+GitLab uses a shared lock mechanism: `ExclusiveLease` to prevent simultaneous operations
+in a shared resource. An example is running periodic garbage collection on repositories.
+
+In very specific situations, a operation locked by an Exclusive Lease can fail without
+releasing the lock. If you can't wait for it to expire, you can run this task to manually
+clear it.
+
+To clear all exclusive leases:
+
+DANGER: **DANGER**:
+Don't run it while GitLab or Sidekiq is running
+
+```bash
+sudo gitlab-rake gitlab:exclusive_lease:clear
+```
+
+To specify a lease `type` or lease `type + id`, specify a scope:
+
+```bash
+# to clear all leases for repository garbage collection:
+sudo gitlab-rake gitlab:exclusive_lease:clear[project_housekeeping:*]
+
+# to clear a lease for repository garbage collection in a specific project: (id=4)
+sudo gitlab-rake gitlab:exclusive_lease:clear[project_housekeeping:4]
+```
diff --git a/lib/gitlab/exclusive_lease.rb b/lib/gitlab/exclusive_lease.rb
index d928301c011..12b5e240962 100644
--- a/lib/gitlab/exclusive_lease.rb
+++ b/lib/gitlab/exclusive_lease.rb
@@ -43,9 +43,9 @@ module Gitlab
# Removes any existing exclusive_lease from redis
# Don't run this in a live system without making sure no one is using the leases
- def self.reset_all!
+ def self.reset_all!(scope = '*')
Gitlab::Redis::SharedState.with do |redis|
- redis.scan_each(match: redis_shared_state_key('*')).each do |key|
+ redis.scan_each(match: redis_shared_state_key(scope)).each do |key|
redis.del(key)
end
end
diff --git a/lib/tasks/gitlab/exclusive_lease.rake b/lib/tasks/gitlab/exclusive_lease.rake
index 27582819e0b..83722bf6d94 100644
--- a/lib/tasks/gitlab/exclusive_lease.rake
+++ b/lib/tasks/gitlab/exclusive_lease.rake
@@ -1,8 +1,8 @@
namespace :gitlab do
namespace :exclusive_lease do
- desc 'GitLab | Clear existing exclusive leases'
- task clear: :environment do
- Gitlab::ExclusiveLease.reset_all!
+ desc 'GitLab | Clear existing exclusive leases for specified scope (default: *)'
+ task :clear, [:scope] => [:environment] do |_, args|
+ args[:scope].nil? ? Gitlab::ExclusiveLease.reset_all! : Gitlab::ExclusiveLease.reset_all!(args[:scope])
puts 'All exclusive lease entries were removed.'
end
end