Browse Source

Fixes #4169 - Zendesk migration runs randomly in ssl handshake failure triggered from Zendesk site without a retry

Dominik Klein 2 years ago
parent
commit
353bc04209

+ 4 - 4
lib/sequencer/unit/import/zendesk/sub_sequence/base.rb

@@ -43,7 +43,7 @@ class Sequencer
 
             def resource_iteration(&block)
               resource_collection.public_send(resource_iteration_method, &block)
-            rescue ZendeskAPI::Error::NetworkError => e
+            rescue ZendeskAPI::Error::NetworkError, Faraday::SSLError => e
               return if expected_exception?(e)
               raise if !retry_exception?(e)
               raise if (fail_count ||= 1) > 10
@@ -58,14 +58,14 @@ class Sequencer
 
             # #2262 Zendesk-Import fails for User & Organizations when 403 "access" denied
             def expected_exception?(e)
-              status = e.response.status.to_s
-              return false if status != '403'
+              status = e.response&.status.to_s
+              return false if !status || status != '403'
 
               %w[UserField OrganizationField].include?(resource_klass)
             end
 
             def retry_exception?(e)
-              !(200..399).cover? e&.response&.status
+              e.is_a?(Faraday::SSLError) || !(200..399).cover?(e&.response&.status)
             end
 
             def resource_collection

+ 3 - 0
lib/sequencer/unit/zendesk/client.rb

@@ -22,6 +22,9 @@ class Sequencer
             # then retry the request.
             config.retry = true
 
+            # Activate the retry also for exception, e.g. for Faraday::SSLError.
+            config.retry_on_exception = true
+
             # disable cache to avoid unneeded memory consumption
             # since we are using each object only once
             # Inspired by: https://medium.com/swiftype-engineering/using-jmat-to-find-analyze-memory-in-jruby-1c4196c1ec72

+ 6 - 0
spec/lib/sequencer/unit/import/zendesk/sub_sequence/base_examples.rb

@@ -117,5 +117,11 @@ RSpec.shared_examples 'Sequencer::Unit::Import::Zendesk::SubSequence::Base' do
 
       include_examples 'retries ten times, in 10s intervals'
     end
+
+    context 'when Faraday::SSLError by peer occurs' do
+      let(:api_error) { Faraday::SSLError.new('sslv3 alert handshake failure') }
+
+      include_examples 'retries ten times, in 10s intervals'
+    end
   end
 end