diff options
| author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-23 03:17:13 +0000 |
|---|---|---|
| committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-23 03:17:13 +0000 |
| commit | a9fa13e4ba46e00081cec1f3af332edcd1520785 (patch) | |
| tree | 1d3bca7bd91d7b121633cd3536c0d31031fdb7e6 /app/services/web_hooks | |
| parent | 6adb784bf2839a2b8a73de5602cbfe617836526c (diff) | |
| download | gitlab-ce-a9fa13e4ba46e00081cec1f3af332edcd1520785.tar.gz | |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services/web_hooks')
| -rw-r--r-- | app/services/web_hooks/log_execution_service.rb | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/app/services/web_hooks/log_execution_service.rb b/app/services/web_hooks/log_execution_service.rb index 6e58e15f093..8a6ba1d2380 100644 --- a/app/services/web_hooks/log_execution_service.rb +++ b/app/services/web_hooks/log_execution_service.rb @@ -2,6 +2,12 @@ module WebHooks class LogExecutionService + include ::Gitlab::ExclusiveLeaseHelpers + + LOCK_TTL = 15.seconds.freeze + LOCK_SLEEP = 0.25.seconds.freeze + LOCK_RETRY = 65 + attr_reader :hook, :log_data, :response_category def initialize(hook:, log_data:, response_category:) @@ -11,7 +17,7 @@ module WebHooks end def execute - update_hook_executability + update_hook_failure_state log_execution end @@ -21,15 +27,25 @@ module WebHooks WebHookLog.create!(web_hook: hook, **log_data.transform_keys(&:to_sym)) end - def update_hook_executability - case response_category - when :ok - hook.enable! - when :error - hook.backoff! - when :failed - hook.failed! + # Perform this operation within an `Gitlab::ExclusiveLease` lock to make it + # safe to be called concurrently from different workers. + def update_hook_failure_state + in_lock(lock_name, ttl: LOCK_TTL, sleep_sec: LOCK_SLEEP, retries: LOCK_RETRY) do |retried| + hook.reset # Reload within the lock so properties are guaranteed to be current. + + case response_category + when :ok + hook.enable! + when :error + hook.backoff! + when :failed + hook.failed! + end end end + + def lock_name + "web_hooks:update_hook_failure_state:#{hook.id}" + end end end |
