From bbe4813c083bf95ebe7a5a6dbb519f808ba2ab98 Mon Sep 17 00:00:00 2001 From: Adam McCrea Date: Sat, 11 Mar 2023 09:22:04 -0500 Subject: [PATCH] fix: Gracefully handle several types of transient TCP errors --- judoscale-ruby/lib/judoscale/adapter_api.rb | 12 ++++++++++-- judoscale-ruby/test/adapter_api_test.rb | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/judoscale-ruby/lib/judoscale/adapter_api.rb b/judoscale-ruby/lib/judoscale/adapter_api.rb index 8da70461..649ba6df 100644 --- a/judoscale-ruby/lib/judoscale/adapter_api.rb +++ b/judoscale-ruby/lib/judoscale/adapter_api.rb @@ -10,6 +10,14 @@ class AdapterApi include Logger SUCCESS = "success" + TRANSIENT_ERRORS = [ + Errno::ECONNREFUSED, + Errno::ECONNRESET, + Net::OpenTimeout, + Net::ReadTimeout, + OpenSSL::SSL::SSLError, + ] + def initialize(config) @config = config @@ -43,14 +51,14 @@ def post_raw(options) when 200...300 then SuccessResponse.new(response.body) else FailureResponse.new([response.code, response.message].join(" - ")) end - rescue Net::OpenTimeout + rescue *TRANSIENT_ERRORS => ex if attempts < 3 # TCP timeouts happen sometimes, but they can usually be successfully retried in a moment sleep 0.01 attempts += 1 retry else - FailureResponse.new("Timeout while obtaining TCP connection to #{uri.host}") + FailureResponse.new("Could not connect to #{uri.host}: #{ex.inspect}") end end diff --git a/judoscale-ruby/test/adapter_api_test.rb b/judoscale-ruby/test/adapter_api_test.rb index 1e1ca6d6..c1abe850 100644 --- a/judoscale-ruby/test/adapter_api_test.rb +++ b/judoscale-ruby/test/adapter_api_test.rb @@ -57,7 +57,7 @@ result = adapter_api.report_metrics(report_params) _(result).must_be_instance_of Judoscale::AdapterApi::FailureResponse - _(result.failure_message).must_equal "Timeout while obtaining TCP connection to railsautoscale.dev" + _(result.failure_message).must_equal "Could not connect to railsautoscale.dev: #" assert_requested stub, times: 3 end