Module: Vagrant::Util::Retryable

Defined in:
lib/vagrant/util/retryable.rb

Instance Method Summary collapse

Instance Method Details

#retryable(opts = nil) ⇒ Object

Retries a given block a specified number of times in the event the specified exception is raised. If the retries run out, the final exception is raised.

This code is adapted slightly from the following blog post: blog.codefront.net/2008/01/14/retrying-code-blocks-in-ruby-on-exceptions-whatever/



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/vagrant/util/retryable.rb', line 12

def retryable(opts=nil)
  logger = nil
  opts   = { :tries => 1, :on => Exception }.merge(opts || {})

  begin
    return yield
  rescue *opts[:on] => e
    if (opts[:tries] -= 1) > 0
      logger = Log4r::Logger.new("vagrant::util::retryable")
      logger.info("Retryable exception raised: #{e.inspect}")

      sleep opts[:sleep].to_f if opts[:sleep]
      retry
    end
    raise
  end
end