sub perform_request()

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;
}