diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2020-12-15 12:55:29 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-15 12:55:29 +0100 |
commit | 1045549f85041b13002801808b30a332c3a68c61 (patch) | |
tree | 1ef1f377ee973a8b2ef69b0bf3fc4683d03f2ec5 /lib/paperclip/attachment_extensions.rb | |
parent | 75d2762fdf600de6785f612caf182b32064a9bf6 (diff) |
Add stoplight for object storage failures, return HTTP 503 (#13043)
Diffstat (limited to 'lib/paperclip/attachment_extensions.rb')
-rw-r--r-- | lib/paperclip/attachment_extensions.rb | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/paperclip/attachment_extensions.rb b/lib/paperclip/attachment_extensions.rb index 752e79e65..94f7769b6 100644 --- a/lib/paperclip/attachment_extensions.rb +++ b/lib/paperclip/attachment_extensions.rb @@ -39,6 +39,23 @@ module Paperclip def default_url(style_name = default_style) @url_generator.for_as_default(style_name) end + + STOPLIGHT_THRESHOLD = 10 + STOPLIGHT_COOLDOWN = 30 + + # We overwrite this method to put a circuit breaker around + # calls to object storage, to stop hitting APIs that are slow + # to respond or don't respond at all and as such minimize the + # impact of object storage outages on application throughput + def save + Stoplight('object-storage') { super }.with_threshold(STOPLIGHT_THRESHOLD).with_cool_off_time(STOPLIGHT_COOLDOWN).with_error_handler do |error, handle| + if error.is_a?(Seahorse::Client::NetworkingError) + handle.call(error) + else + raise error + end + end.run + end end end |