@@ -22,7 +22,8 @@ public class Transport : ITransport
22
22
{
23
23
const int BUFFER_SIZE = 4096 ;
24
24
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}" ;
26
27
protected internal readonly IConnectionConfigurationValues ConfigurationValues ;
27
28
protected internal readonly IConnection Connection ;
28
29
private readonly IElasticsearchSerializer _serializer ;
@@ -120,8 +121,8 @@ private IList<Uri> Sniff(ITransportRequestState ownerState = null)
120
121
//inform the owing request state of the requests the sniffs did.
121
122
if ( requestState . RequestMetrics != null && ownerState != null )
122
123
{
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 ;
125
126
126
127
127
128
if ( ownerState . RequestMetrics == null ) ownerState . RequestMetrics = new List < RequestMetrics > ( ) ;
@@ -334,7 +335,7 @@ private ElasticsearchResponse<T> DoRequest<T>(TransportRequestState<T> requestSt
334
335
private ElasticsearchResponse < T > RetryRequest < T > ( TransportRequestState < T > requestState , Exception e = null )
335
336
{
336
337
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 ) ;
338
339
339
340
this . _connectionPool . MarkDead ( requestState . CurrentNode , this . ConfigurationValues . DeadTimeout , this . ConfigurationValues . MaxDeadTimeout ) ;
340
341
@@ -464,7 +465,7 @@ private Task<ElasticsearchResponse<T>> FinishOrRetryRequestAsync<T>(TransportReq
464
465
private Task < ElasticsearchResponse < T > > RetryRequestAsync < T > ( TransportRequestState < T > requestState , Exception e = null )
465
466
{
466
467
var maxRetries = this . GetMaximumRetries ( requestState . RequestConfiguration ) ;
467
- var exceptionMessage = MaxRetryExceptionMessage . F ( requestState . Method , requestState . Path , requestState . Retried ) ;
468
+ var exceptionMessage = CreateMaxRetryExceptionMessage ( requestState , e ) ;
468
469
469
470
this . _connectionPool . MarkDead ( requestState . CurrentNode , this . ConfigurationValues . DeadTimeout , this . ConfigurationValues . MaxDeadTimeout ) ;
470
471
@@ -476,6 +477,29 @@ private Task<ElasticsearchResponse<T>> RetryRequestAsync<T>(TransportRequestStat
476
477
return this . DoRequestAsync < T > ( requestState ) ;
477
478
}
478
479
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
+
479
503
private Task < ElasticsearchResponse < Stream > > CallIntoConnectionAsync < T > ( TransportRequestState < T > requestState )
480
504
{
481
505
var uri = requestState . CreatePathOnCurrentNode ( ) ;
@@ -570,8 +594,8 @@ private ElasticsearchServerError ThrowOrGetErrorFromStreamResponse<T>(
570
594
private static bool IsValidResponse ( ITransportRequestState requestState , IElasticsearchResponse streamResponse )
571
595
{
572
596
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 ) ) ;
575
599
}
576
600
577
601
private bool TypeOfResponseCopiesDirectly < T > ( )
@@ -621,7 +645,7 @@ ITransportRequestState requestState
621
645
}
622
646
623
647
private Task < ElasticsearchResponse < T > > StreamToTypedResponseAsync < T > (
624
- ElasticsearchResponse < Stream > streamResponse ,
648
+ ElasticsearchResponse < Stream > streamResponse ,
625
649
ITransportRequestState requestState
626
650
)
627
651
{
@@ -702,8 +726,8 @@ ITransportRequestState requestState
702
726
}
703
727
704
728
private Task < ElasticsearchResponse < T > > _deserializeAsyncToResponse < T > (
705
- Stream response ,
706
- ITransportRequestState requestState ,
729
+ Stream response ,
730
+ ITransportRequestState requestState ,
707
731
ElasticsearchResponse < T > typedResponse
708
732
)
709
733
{
0 commit comments