class Asperalm::Fasp::ResumePolicy

implements a simple resume policy

Constants

DEFAULTS

list of supported parameters and default values

Public Class Methods

new(params=nil) click to toggle source
# File lib/asperalm/fasp/resume_policy.rb, line 17
def initialize(params=nil)
  @parameters=DEFAULTS.clone
  return if params.nil?
  raise "expecting Hash (or nil), but have #{params.class}" unless params.is_a?(Hash)
  params.each do |k,v|
    if DEFAULTS.has_key?(k)
      @parameters[k]=v
    else
      raise "unknown resume parameter: #{k}, expect one of #{DEFAULTS.keys.map{|i|i.to_s}.join(",")}"
    end
  end
end

Public Instance Methods

process(&block) click to toggle source

calls block a number of times (resumes) until success or limit reached this is re-entrant, one resumer can handle multiple transfers in //

# File lib/asperalm/fasp/resume_policy.rb, line 32
def process(&block)
  # maximum of retry
  remaining_resumes = @parameters[:iter_max]
  sleep_seconds = @parameters[:sleep_initial]
  Log.log.debug("retries=#{remaining_resumes}")
  # try to send the file until ascp is succesful
  loop do
    Log.log.debug('transfer starting');
    begin
      block.call
      break
    rescue Fasp::Error => e
      Log.log.warn("An error occured: #{e.message}" );
      # failure in ascp
      if e.retryable? then
        # exit if we exceed the max number of retry
        unless remaining_resumes > 0
          Log.log.error "Maximum number of retry reached"
          raise Fasp::Error,"max retry after: [#{status[:message]}]"
        end
      else
        # give one chance only to non retryable errors
        unless remaining_resumes.eql?(@parameters[:iter_max])
          Log.log.error('non-retryable error')
          raise e
        end
      end
    end

    # take this retry in account
    remaining_resumes-=1
    Log.log.warn( "resuming in  #{sleep_seconds} seconds (retry left:#{remaining_resumes})" );

    # wait a bit before retrying, maybe network condition will be better
    sleep(sleep_seconds)

    # increase retry period
    sleep_seconds *= @parameters[:sleep_factor]
    # cap value
    sleep_seconds = @parameters[:sleep_max] if sleep_seconds > @parameters[:sleep_max]
  end # loop
end