@@ -22,7 +22,8 @@ public class Transport : ITransport
2222 {
2323 const int BUFFER_SIZE = 4096 ;
2424
25- protected static readonly string MaxRetryExceptionMessage = "Unable to perform request: '{0} {1}' on any of the nodes after retrying {2} times." ;
25+ protected static readonly string MaxRetryExceptionMessage = "Failed after retrying {2} times: '{0} {1}'. {3}" ;
26+ protected static readonly string MaxRetryInnerMessage = "InnerException: {0}, InnerMessage: {1}" ;
2627 protected internal readonly IConnectionConfigurationValues ConfigurationValues ;
2728 protected internal readonly IConnection Connection ;
2829 private readonly IElasticsearchSerializer _serializer ;
@@ -120,8 +121,8 @@ private IList<Uri> Sniff(ITransportRequestState ownerState = null)
120121 //inform the owing request state of the requests the sniffs did.
121122 if ( requestState . RequestMetrics != null && ownerState != null )
122123 {
123- foreach ( var r in requestState . RequestMetrics . Where ( p=> p . RequestType == RequestType . ElasticsearchCall ) )
124- r . RequestType = RequestType . Sniff ;
124+ foreach ( var r in requestState . RequestMetrics . Where ( p => p . RequestType == RequestType . ElasticsearchCall ) )
125+ r . RequestType = RequestType . Sniff ;
125126
126127
127128 if ( ownerState . RequestMetrics == null ) ownerState . RequestMetrics = new List < RequestMetrics > ( ) ;
@@ -334,7 +335,7 @@ private ElasticsearchResponse<T> DoRequest<T>(TransportRequestState<T> requestSt
334335 private ElasticsearchResponse < T > RetryRequest < T > ( TransportRequestState < T > requestState , Exception e = null )
335336 {
336337 var maxRetries = this . GetMaximumRetries ( requestState . RequestConfiguration ) ;
337- var exceptionMessage = MaxRetryExceptionMessage . F ( requestState . Method , requestState . Path . IsNullOrEmpty ( ) ? "/" : requestState . Path , requestState . Retried ) ;
338+ var exceptionMessage = CreateMaxRetryExceptionMessage ( requestState , e ) ;
338339
339340 this . _connectionPool . MarkDead ( requestState . CurrentNode , this . ConfigurationValues . DeadTimeout , this . ConfigurationValues . MaxDeadTimeout ) ;
340341
@@ -464,7 +465,7 @@ private Task<ElasticsearchResponse<T>> FinishOrRetryRequestAsync<T>(TransportReq
464465 private Task < ElasticsearchResponse < T > > RetryRequestAsync < T > ( TransportRequestState < T > requestState , Exception e = null )
465466 {
466467 var maxRetries = this . GetMaximumRetries ( requestState . RequestConfiguration ) ;
467- var exceptionMessage = MaxRetryExceptionMessage . F ( requestState . Method , requestState . Path , requestState . Retried ) ;
468+ var exceptionMessage = CreateMaxRetryExceptionMessage ( requestState , e ) ;
468469
469470 this . _connectionPool . MarkDead ( requestState . CurrentNode , this . ConfigurationValues . DeadTimeout , this . ConfigurationValues . MaxDeadTimeout ) ;
470471
@@ -476,6 +477,29 @@ private Task<ElasticsearchResponse<T>> RetryRequestAsync<T>(TransportRequestStat
476477 return this . DoRequestAsync < T > ( requestState ) ;
477478 }
478479
480+ private static string CreateMaxRetryExceptionMessage < T > ( TransportRequestState < T > requestState , Exception e )
481+ {
482+ string innerException = null ;
483+ if ( e != null )
484+ {
485+ var aggregate = e as AggregateException ;
486+ if ( aggregate != null )
487+ {
488+
489+ aggregate = aggregate . Flatten ( ) ;
490+ var innerExceptions = aggregate . InnerExceptions
491+ . Select ( ae => MaxRetryInnerMessage . F ( ae . GetType ( ) . Name , ae . Message ) )
492+ . ToList ( ) ;
493+ innerException = string . Join ( "\r \n " , innerExceptions ) ;
494+ }
495+ else
496+ innerException = MaxRetryInnerMessage . F ( e . GetType ( ) . Name , e . Message ) ;
497+ }
498+ var exceptionMessage = MaxRetryExceptionMessage
499+ . F ( requestState . Method , requestState . Path , requestState . Retried , innerException ) ;
500+ return exceptionMessage ;
501+ }
502+
479503 private Task < ElasticsearchResponse < Stream > > CallIntoConnectionAsync < T > ( TransportRequestState < T > requestState )
480504 {
481505 var uri = requestState . CreatePathOnCurrentNode ( ) ;
@@ -570,8 +594,8 @@ private ElasticsearchServerError ThrowOrGetErrorFromStreamResponse<T>(
570594 private static bool IsValidResponse ( ITransportRequestState requestState , IElasticsearchResponse streamResponse )
571595 {
572596 return ( streamResponse . Success || requestState . RequestConfiguration != null ) &&
573- ( streamResponse . Success || requestState . RequestConfiguration == null ||
574- requestState . RequestConfiguration . AllowedStatusCodes . Any ( i => i == streamResponse . HttpStatusCode ) ) ;
597+ ( streamResponse . Success || requestState . RequestConfiguration == null ||
598+ requestState . RequestConfiguration . AllowedStatusCodes . Any ( i => i == streamResponse . HttpStatusCode ) ) ;
575599 }
576600
577601 private bool TypeOfResponseCopiesDirectly < T > ( )
@@ -621,7 +645,7 @@ ITransportRequestState requestState
621645 }
622646
623647 private Task < ElasticsearchResponse < T > > StreamToTypedResponseAsync < T > (
624- ElasticsearchResponse < Stream > streamResponse ,
648+ ElasticsearchResponse < Stream > streamResponse ,
625649 ITransportRequestState requestState
626650 )
627651 {
@@ -702,8 +726,8 @@ ITransportRequestState requestState
702726 }
703727
704728 private Task < ElasticsearchResponse < T > > _deserializeAsyncToResponse < T > (
705- Stream response ,
706- ITransportRequestState requestState ,
729+ Stream response ,
730+ ITransportRequestState requestState ,
707731 ElasticsearchResponse < T > typedResponse
708732 )
709733 {
0 commit comments