about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2018-04-07 21:36:58 +0200
committerGitHub <noreply@github.com>2018-04-07 21:36:58 +0200
commitd4de2239b0ab04bf6a42db9f28d1fdd8e45f7d8b (patch)
treedf703560743b04687d2bab7ba2ebf20de7795fca
parent4a9becfca2d7399acb422da646c48bdd9f39c989 (diff)
Add a circuit breaker for ActivityPub deliveries (#7053)
-rw-r--r--Gemfile2
-rw-r--r--Gemfile.lock2
-rw-r--r--app/workers/activitypub/delivery_worker.rb14
-rw-r--r--config/initializers/stoplight.rb3
4 files changed, 16 insertions, 5 deletions
diff --git a/Gemfile b/Gemfile
index 9e644e7ae..4a5a166bd 100644
--- a/Gemfile
+++ b/Gemfile
@@ -35,6 +35,7 @@ gem 'devise-two-factor', '~> 3.0'
 group :pam_authentication, optional: true do
   gem 'devise_pam_authenticatable2', '~> 9.0'
 end
+
 gem 'net-ldap', '~> 0.10'
 gem 'omniauth-cas', '~> 1.1'
 gem 'omniauth-saml', '~> 1.10'
@@ -79,6 +80,7 @@ gem 'sidekiq-bulk', '~>0.1.1'
 gem 'simple-navigation', '~> 4.0'
 gem 'simple_form', '~> 3.4'
 gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie'
+gem 'stoplight', '~> 2.1.3'
 gem 'strong_migrations'
 gem 'tty-command'
 gem 'tty-prompt'
diff --git a/Gemfile.lock b/Gemfile.lock
index a185a602e..0f5a1fb6a 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -550,6 +550,7 @@ GEM
       net-scp (>= 1.1.2)
       net-ssh (>= 2.8.0)
     statsd-ruby (1.2.1)
+    stoplight (2.1.3)
     streamio-ffmpeg (3.0.2)
       multi_json (~> 1.8)
     strong_migrations (0.1.9)
@@ -716,6 +717,7 @@ DEPENDENCIES
   simple_form (~> 3.4)
   simplecov (~> 0.14)
   sprockets-rails (~> 3.2)
+  stoplight (~> 2.1.3)
   streamio-ffmpeg (~> 3.0)
   strong_migrations
   tty-command
diff --git a/app/workers/activitypub/delivery_worker.rb b/app/workers/activitypub/delivery_worker.rb
index e6cfd0d07..adffd1d3b 100644
--- a/app/workers/activitypub/delivery_worker.rb
+++ b/app/workers/activitypub/delivery_worker.rb
@@ -12,9 +12,7 @@ class ActivityPub::DeliveryWorker
     @source_account = Account.find(source_account_id)
     @inbox_url      = inbox_url
 
-    perform_request do |response|
-      raise Mastodon::UnexpectedResponseError, response unless response_successful? response
-    end
+    perform_request
 
     failure_tracker.track_success!
   rescue => e
@@ -30,8 +28,14 @@ class ActivityPub::DeliveryWorker
     request.add_headers(HEADERS)
   end
 
-  def perform_request(&block)
-    build_request.perform(&block)
+  def perform_request
+    light = Stoplight(@inbox_url) do
+      build_request.perform do |response|
+        raise Mastodon::UnexpectedResponseError, response unless response_successful?(response)
+      end
+    end
+
+    light.run
   end
 
   def response_successful?(response)
diff --git a/config/initializers/stoplight.rb b/config/initializers/stoplight.rb
new file mode 100644
index 000000000..1bd4ee6e7
--- /dev/null
+++ b/config/initializers/stoplight.rb
@@ -0,0 +1,3 @@
+require 'stoplight'
+
+Stoplight::Light.default_data_store = Stoplight::DataStore::Redis.new(Redis.current)