From b42ff1ded1a2973c4cee029e7d29c3a7cbe260da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20Endsj=C3=B8?= Date: Sat, 17 Oct 2015 15:37:25 +0200 Subject: [PATCH] Improve "Service Unavailable" error reporting Service Unavailable can happen before shards are updates (creating a new index, and then query it before it's created). These errors are not reported as regular errors, and receives a very generic errormessage. This commit improves the error message for these errors. Closes #1596 --- .../Connection/RequestHandlers/RequestHandler.cs | 2 +- .../Connection/RequestHandlers/RequestHandlerAsync.cs | 2 +- .../Connection/RequestHandlers/RequestHandlerBase.cs | 11 ++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandler.cs b/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandler.cs index 7ad8abcb5ad..cb993f93207 100644 --- a/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandler.cs +++ b/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandler.cs @@ -106,7 +106,7 @@ private ElasticsearchResponse DoElasticsearchCall(TransportRequestSta return this.StreamToTypedResponse(streamResponse, requestState, bytes); // If error read error - error = GetErrorFromStream(streamResponse.Response); + error = GetErrorFromStream(streamResponse.Response, streamResponse.HttpStatusCode ?? 0); var typedResponse = ElasticsearchResponse.CloneFrom(streamResponse, default(T)); this.SetStringOrByteResult(typedResponse, bytes); return typedResponse; diff --git a/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandlerAsync.cs b/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandlerAsync.cs index 6f2bf648dee..0c7acbd9882 100644 --- a/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandlerAsync.cs +++ b/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandlerAsync.cs @@ -131,7 +131,7 @@ private Task> ReturnTypedResponse(ElasticsearchResponse(streamResponse, default(T)); if (!isValidResponse) { - response.Error = GetErrorFromStream(gotStream.Result); + response.Error = GetErrorFromStream(gotStream.Result, streamResponse.HttpStatusCode ?? 0); this.SetStringOrByteResult(typedResponse, response.Bytes); if (gotStream.Result != null) gotStream.Result.Close(); response.Response = typedResponse; diff --git a/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandlerBase.cs b/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandlerBase.cs index 49f471c7360..26aba6b6bc7 100644 --- a/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandlerBase.cs +++ b/src/Elasticsearch.Net/Connection/RequestHandlers/RequestHandlerBase.cs @@ -211,11 +211,20 @@ protected void SetByteResult(ElasticsearchResponse response, byte[] rawR response.Response = rawResponse; } - protected ElasticsearchServerError GetErrorFromStream(Stream stream) + protected ElasticsearchServerError GetErrorFromStream(Stream stream, int httpStatusCode=0) { try { var e = this._serializer.Deserialize(stream); + if (e != null && e.status == 0) + { + // Service unavailable isn't reported as a regular error, and + // thus won't be serialized as such. This workaround improves + // the errormessage for these errors. + e.status = httpStatusCode; + if (e.status == 503 && e.error.IsNullOrEmpty()) + e.error = "ServiceUnavailableException[Service Unavaliable. Try again later.]"; + } return ElasticsearchServerError.Create(e); } // ReSharper disable once EmptyGeneralCatchClause