-
Notifications
You must be signed in to change notification settings - Fork 614
Description
The perform_request method will get itself into an infinite loop when reload_on_failure is set to true and more than 1 host is provided.
The issue is in the rescue block:
if @options[:reload_on_failure] and tries < connections.all.size
logger.warn "[#{e.class}] Reloading connections (attempt #{tries} of #{connections.all.size})" if logger
reload_connections! and retry
endOn the first try, tries is 1 and connections.all.size is greater than 1 so the if condition is met. reload_connections! will then call sniffer.hosts that then also calls the perform_request method. tries is reset at 1 when this method is called so this rescue block is reached and and the cycle continues, infinitely.
The key to getting the SystemStackError: stack level too deep error and not a timeout error is to set the sniffer_timeout high enough so that the timeout doesn't interrupt the infinite loop before the SystemStackError: stack level too deep is thrown. This is why the error was originally not able to be reproduced.
I was able to reproduce the error with the following client settings:
{
hosts: ['http://unavabilable:9200', 'http://unavabilable:9201'],
reload_on_failure: true,
sniffer_timeout: 50
}> client.info
# SystemStackError: stack level too deepPlease see this issue for further history: #177