Add a circuit breaker for ActivityPub deliveries (#7053)
This commit is contained in:
		
							
								
								
									
										2
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								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'
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								config/initializers/stoplight.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								config/initializers/stoplight.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
require 'stoplight'
 | 
			
		||||
 | 
			
		||||
Stoplight::Light.default_data_store = Stoplight::DataStore::Redis.new(Redis.current)
 | 
			
		||||
		Reference in New Issue
	
	Block a user