Commit bb09157

mokha <mokha@cisco.com>
2018-11-10 17:42:56
retry with exponential delay
1 parent 75b658d
Changed files (3)
bin
lib
net
test
bin/cibuild
@@ -15,6 +15,7 @@ export RUBY_GC_HEAP_INIT_SLOTS=800000
 export RUBY_HEAP_FREE_MIN=100000
 export RUBY_HEAP_SLOTS_INCREMENT=400000
 export RUBY_HEAP_SLOTS_GROWTH_FACTOR=1
+export CIBUILD=1
 
 ruby -v
 gem install bundler --no-ri --no-rdoc --conservative
lib/net/hippie/client.rb
@@ -62,13 +62,25 @@ module Net
         execute(uri, request, &block)
       end
 
+      # attempt 1 -> delay 1 second
+      # attempt 2 -> delay 2 second
+      # attempt 3 -> delay 4 second
+      # attempt 4 -> delay 8 second
+      # attempt 5 -> delay 16 second
+      # attempt 6 -> delay 32 second
+      # attempt 7 -> delay 64 second
+      # attempt 8 -> delay 128 second
       def with_retry(retries: 3)
-        retries.downto(0) do |n|
+        retries = 3 if retries <= 0
+        0.upto(retries) do |n|
           return yield self
         rescue *::Net::Hippie::CONNECTION_ERRORS => error
-          logger.error("Retry Attempt: #{n}")
-          logger.error(error)
-          raise error if n.zero?
+          raise error if n >= retries
+
+          delay = 2**n
+          logger.warn("Retry: #{n + 1}/#{retries}. Delay: #{delay} second(s)")
+          logger.warn(error.message)
+          sleep delay
         end
       end
 
test/net/client_test.rb
@@ -6,7 +6,7 @@ class ClientTest < Minitest::Test
   def initialize(*args)
     super
     @subject = Net::Hippie::Client.new
-    @subject.logger = Logger.new('/dev/null')
+    @subject.logger = ENV['CIBUILD'] ? Logger.new('/dev/null') : Logger.new(STDOUT)
   end
 
   def test_get