class Fluent::PluginHelper::RetryState::RetryStateMachine

def initialize(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threshold)

def initialize(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threshold)
  @title = title
  @start = current_time
  @steps = 0
  @next_time = nil # should be initialized for first retry by child class
  @timeout = timeout
  @timeout_at = @start + timeout
  @current = :primary
  if randomize_width < 0 || randomize_width > 0.5
    raise "BUG: randomize_width MUST be between 0 and 0.5"
  end
  @randomize = randomize
  @randomize_width = randomize_width
  @forever = forever
  @max_steps = max_steps
  @secondary = secondary
  @secondary_threshold = secondary_threshold
  if @secondary
    raise "BUG: secondary_transition_threshold MUST be between 0 and 1" if @secondary_threshold <= 0 || @secondary_threshold >= 1
    max_retry_timeout = timeout
    if max_steps
      timeout_by_max_steps = calc_max_retry_timeout(max_steps)
      max_retry_timeout = timeout_by_max_steps if timeout_by_max_steps < max_retry_timeout
    end
    @secondary_transition_at = @start + max_retry_timeout * @secondary_threshold
    @secondary_transition_steps = nil
  end
end