summaryrefslogtreecommitdiff
path: root/app/services/web_hooks
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-02-23 03:17:13 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-02-23 03:17:13 +0000
commita9fa13e4ba46e00081cec1f3af332edcd1520785 (patch)
tree1d3bca7bd91d7b121633cd3536c0d31031fdb7e6 /app/services/web_hooks
parent6adb784bf2839a2b8a73de5602cbfe617836526c (diff)
downloadgitlab-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.rb34
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