diff options
author | Oswaldo Ferreira <oswaldo@gitlab.com> | 2019-07-23 21:51:23 -0300 |
---|---|---|
committer | Oswaldo Ferreira <oswaldo@gitlab.com> | 2019-07-31 19:58:43 -0300 |
commit | f4cd926cf3eec069396ab995b3553f40617c19e6 (patch) | |
tree | 7e671fe45c2c80fa107a75334a2df01fcd3342f5 /lib | |
parent | d55b52f2e31db2458407741e06dbe4a469a71bcd (diff) | |
download | gitlab-ce-f4cd926cf3eec069396ab995b3553f40617c19e6.tar.gz |
Add exclusive lease to mergeability check processosw-avoid-errors-due-to-concurrent-calls
Concurrent calls to UserMergeToRef RPC updating a single ref
can lead to an opaque fail that is being rescued at Gitaly.
So this commit adds an exclusive lease to the mergeability
check process with the key as the current MR ID.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/exclusive_lease_helpers.rb | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/lib/gitlab/exclusive_lease_helpers.rb b/lib/gitlab/exclusive_lease_helpers.rb index 7961d4bbd6e..61eb030563d 100644 --- a/lib/gitlab/exclusive_lease_helpers.rb +++ b/lib/gitlab/exclusive_lease_helpers.rb @@ -15,17 +15,18 @@ module Gitlab raise ArgumentError, 'Key needs to be specified' unless key lease = Gitlab::ExclusiveLease.new(key, timeout: ttl) + retried = false until uuid = lease.try_obtain # Keep trying until we obtain the lease. To prevent hammering Redis too # much we'll wait for a bit. sleep(sleep_sec) - break if (retries -= 1) < 0 + (retries -= 1) < 0 ? break : retried ||= true end raise FailedToObtainLockError, 'Failed to obtain a lock' unless uuid - yield + yield(retried) ensure Gitlab::ExclusiveLease.cancel(key, uuid) end |