module ElasticSearch::RetryingClient

Constants

RETRYING_DEFAULTS

Public Class Methods

new(servers_or_url, options={}) click to toggle source

use cluster status to get server list

Calls superclass method
# File lib/elasticsearch/client/retrying_client.rb, line 17
def initialize(servers_or_url, options={})
  super
  @options = RETRYING_DEFAULTS.merge(@options)
  @retries = options[:retries] || @servers.size
  @connect_retries_count = 0
  @execute_retries_count = 0
  @request_count = 0
  @max_requests = @options[:server_max_requests]
  @retry_period = @options[:server_retry_period]
  rebuild_live_server_list!
end

Public Instance Methods

connect!() click to toggle source
Calls superclass method
# File lib/elasticsearch/client/retrying_client.rb, line 29
def connect!
  @current_server = next_server
  clear_connect_retries_count_after do
    super
  end
rescue ElasticSearch::RetryableError => exception
  increment_or_raise_on_connect_retry( exception )
  retry
end
disconnect!() click to toggle source
Calls superclass method
# File lib/elasticsearch/client/retrying_client.rb, line 39
def disconnect!
  # Keep live servers in the list if we have a retry period. Otherwise,
  # always eject, because we will always re-add them.
  if @retry_period && @current_server
    @live_server_list.unshift(@current_server)
  end

  super
  @request_count = 0
end
disconnect_on_max!() click to toggle source
# File lib/elasticsearch/client/retrying_client.rb, line 84
def disconnect_on_max!
  @live_server_list.push(@current_server)
  disconnect!
end
execute(method_name, *args) click to toggle source
Calls superclass method
# File lib/elasticsearch/client/retrying_client.rb, line 70
def execute(method_name, *args)
  disconnect_on_max! if @max_requests and @request_count >= @max_requests
  @request_count += 1
  begin
    clear_execute_retries_count_after do
      super
    end
  rescue ElasticSearch::RetryableError => exception
    disconnect!
    increment_or_raise_on_execute_retry( exception )
    retry
  end
end
next_server() click to toggle source

TODO this can spin indefinitely if timeout > retry_period

# File lib/elasticsearch/client/retrying_client.rb, line 51
def next_server
  if @retry_period
    rebuild_live_server_list! if Time.now > @last_rebuild + @retry_period
    raise NoServersAvailable, "No live servers in #{@servers.inspect} since #{@last_rebuild.inspect}." if @live_server_list.empty?
  elsif @live_server_list.empty?
    rebuild_live_server_list!
  end
  @live_server_list.shift
end
rebuild_live_server_list!() click to toggle source
# File lib/elasticsearch/client/retrying_client.rb, line 61
def rebuild_live_server_list!
  @last_rebuild = Time.now
  if @options[:randomize_server_list]
    @live_server_list = @servers.sort_by { rand }
  else
    @live_server_list = @servers.dup
  end
end

Protected Instance Methods

clear_connect_retries_count_after() { || ... } click to toggle source
# File lib/elasticsearch/client/retrying_client.rb, line 91
def clear_connect_retries_count_after
  result = yield
  @connect_retries_count = 0
  result
end
clear_execute_retries_count_after() { || ... } click to toggle source
# File lib/elasticsearch/client/retrying_client.rb, line 97
def clear_execute_retries_count_after
  result = yield
  @execute_retries_count = 0
  @connect_retries_count = 0
  result
end
increment_or_raise_on_connect_retry( exception ) click to toggle source
# File lib/elasticsearch/client/retrying_client.rb, line 104
def increment_or_raise_on_connect_retry( exception )
  if @retries <= @connect_retries_count
    @connect_retries_count = 0
    @execute_retries_count = 0
    raise exception
  else
    @connect_retries_count += 1
  end
end
increment_or_raise_on_execute_retry( exception ) click to toggle source
# File lib/elasticsearch/client/retrying_client.rb, line 114
def increment_or_raise_on_execute_retry( exception )
  if @retries <= @execute_retries_count
    @execute_retries_count = 0
    @connect_retries_count = 0
    raise exception
  else
    @execute_retries_count += 1
  end
end