Skip to content

Commit 4080a58

Browse files
committed
Updated MaxRetryException message to include innerexception messages so exception track traces are easier to pinpoint.
1 parent 54687a2 commit 4080a58

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

src/Elasticsearch.Net/Connection/Transport.cs

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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
{

src/Elasticsearch.Net/Exceptions/MaxRetryException.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace Elasticsearch.Net.Exceptions
1111
/// </summary>
1212
public class MaxRetryException : Exception
1313
{
14+
1415
public MaxRetryException(string message) : base(message)
1516
{
1617
}

0 commit comments

Comments
 (0)