in lib/Search/Elasticsearch/Transport/Async.pm [30:88]
sub perform_request {
#===================================
my $self = shift;
my $params = $self->tidy_request(@_);
my $pool = $self->cxn_pool;
my $logger = $self->logger;
my $deferred = deferred;
my ( $start, $cxn );
$pool->next_cxn
# perform request
->then(
sub {
$cxn = shift;
$start = time();
$cxn->perform_request($params);
}
)
# log request regardless of success/failure
->finally( sub { $logger->trace_request( $cxn, $params ) } )
->done(
# request succeeded
sub {
my ( $code, $response ) = @_;
$pool->request_ok($cxn);
$logger->trace_response( $cxn, $code, $response,
time() - $start );
$deferred->resolve($response);
},
# request failed
sub {
my $error = upgrade_error( shift(), { request => $params } );
if ( $pool->request_failed( $cxn, $error ) ) {
# log failed, then retry
$logger->debugf( "[%s] %s", $cxn->stringify, "$error" );
$logger->info('Retrying request on a new cxn');
return $self->perform_request($params)->done(
sub { $deferred->resolve(@_) },
sub { $deferred->reject(@_) }
);
}
if ($cxn) {
$logger->trace_request( $cxn, $params );
$logger->trace_error( $cxn, $error );
}
$error->is('NoNodes')
? $logger->critical($error)
: $logger->error($error);
$deferred->reject($error);
}
);
return $deferred->promise;
}