asticsearch завершается ошибкой VerifyRepositoryRequest в C# клиенте Nest - PullRequest
0 голосов
/ 04 февраля 2020

После обновления доasticsearch 7.5.1 следующий код теперь вызывает исключение «Точка входа не найдена»

//old code worked just fine
    var verifyRepositoryResponse = this.elasticClient.VerifyRepository(new VerifyRepositoryRequest("C__MYFOLDER_Backup"));

//new code throws

    var verifyRepositoryResponse = this.elasticClient.Snapshot.VerifyRepository(new VerifyRepositoryRequest("C__MYFOLDER_Backup"));

Обратите внимание, что выполнение следующего запроса через fiddler

POST http://localhost:9200/_snapshot/C__MYFOLDER_Backup/_verify HTTP/1.1
User-Agent: Fiddler
Host: localhost:9200
Content-Type: application/json
Content-Length: 0

возвращает

{"nodes":{"1cWG9trDRi--6I-46lOlBw":{"name":"DESKTOP-5L01F6I"}}}

есть идеи, что вызывает здесь проблему? К сожалению, по этому вопросу нет нулевой документации.

ОБНОВЛЕНИЕ : вызов кода с несуществующим каталогом в качестве аргумента

var verifyRepositoryResponse = this.elasticClient.Snapshot.VerifyRepository(new VerifyRepositoryRequest("C__DOESNOTEXIST_Backup"));

Я получу ответ 4xx, как и ожидалось в этом сценарии. Перед всеми тестами репозитории и базы данных были очищены.

Обновление : Дополнительная информация об ошибке:

"# FailureReason: Unrecoverable/Unexpected BadResponse while attempting POST on http://localhost:9200/_snapshot/C__MYFOLDER_Backup/_verify\r\n - [1] BadResponse: Node: http://localhost:9200/ Exception: EntryPointNotFoundException Took: 00:00:00.1859931\r\n# Audit 
exception in step 1 BadResponse:\r\nSystem.EntryPointNotFoundException: Entry point was not found.\r\n   at Elasticsearch.Net.Utf8Json.IJsonFormatter`1.Deserialize(JsonReader& reader, IJsonFormatterResolver formatterResolver)\r\n   at Deserialize(Object[] , 
JsonReader& , IJsonFormatterResolver )\r\n   at Elasticsearch.Net.Utf8Json.JsonSerializer.Deserialize[T](Byte[] bytes, Int32 offset, IJsonFormatterResolver resolver)\r\n   at Elasticsearch.Net.Utf8Json.JsonSerializer.Deserialize[T](Stream stream, 
IJsonFormatterResolver resolver)\r\n   at Elasticsearch.Net.DiagnosticsSerializerProxy.Deserialize[T](Stream stream)\r\n   at Elasticsearch.Net.ResponseBuilder.SetBody[TResponse](ApiCallDetails details, RequestData requestData, Stream responseStream, String 
mimeType)\r\n   at Elasticsearch.Net.ResponseBuilder.ToResponse[TResponse](RequestData requestData, Exception ex, Nullable`1 statusCode, IEnumerable`1 warnings, Stream responseStream, String mimeType)\r\n   at 
Elasticsearch.Net.HttpWebRequestConnection.Request[TResponse](RequestData requestData)\r\n   at Elasticsearch.Net.RequestPipeline.CallElasticsearch[TResponse](RequestData requestData)\r\n   at Elasticsearch.Net.Transport`1.Request[TResponse](HttpMethod method, 
String path, PostData data, IRequestParameters requestParameters)\r\n# Inner Exception: Entry point was not found.\r\nSystem.EntryPointNotFoundException: Entry point was not found.\r\n   at Elasticsearch.Net.Utf8Json.IJsonFormatter`1.Deserialize(JsonReader& 
reader, IJsonFormatterResolver formatterResolver)\r\n   at Deserialize(Object[] , JsonReader& , IJsonFormatterResolver )\r\n   at Elasticsearch.Net.Utf8Json.JsonSerializer.Deserialize[T](Byte[] bytes, Int32 offset, IJsonFormatterResolver resolver)\r\n   at 
Elasticsearch.Net.Utf8Json.JsonSerializer.Deserialize[T](Stream stream, IJsonFormatterResolver resolver)\r\n   at Elasticsearch.Net.DiagnosticsSerializerProxy.Deserialize[T](Stream stream)\r\n   at 
Elasticsearch.Net.ResponseBuilder.SetBody[TResponse](ApiCallDetails details, RequestData requestData, Stream responseStream, String mimeType)\r\n   at Elasticsearch.Net.ResponseBuilder.ToResponse[TResponse](RequestData requestData, Exception ex, Nullable`1 
statusCode, IEnumerable`1 warnings, Stream responseStream, String mimeType)\r\n   at Elasticsearch.Net.HttpWebRequestConnection.Request[TResponse](RequestData requestData)\r\n   at Elasticsearch.Net.RequestPipeline.CallElasticsearch[TResponse](RequestData 
requestData)\r\n   at Elasticsearch.Net.Transport`1.Request[TResponse](HttpMethod method, String path, PostData data, IRequestParameters requestParameters)\r\n# Exception:\r\nElasticsearch.Net.UnexpectedElasticsearchClientException: Entry point was not found. ---> 
System.EntryPointNotFoundException: Entry point was not found.\r\n   at Elasticsearch.Net.Utf8Json.IJsonFormatter`1.Deserialize(JsonReader& reader, IJsonFormatterResolver formatterResolver)\r\n   at Deserialize(Object[] , JsonReader& , IJsonFormatterResolver 
)\r\n   at Elasticsearch.Net.Utf8Json.JsonSerializer.Deserialize[T](Byte[] bytes, Int32 offset, IJsonFormatterResolver resolver)\r\n   at Elasticsearch.Net.Utf8Json.JsonSerializer.Deserialize[T](Stream stream, IJsonFormatterResolver resolver)\r\n   at 
Elasticsearch.Net.DiagnosticsSerializerProxy.Deserialize[T](Stream stream)\r\n   at Elasticsearch.Net.ResponseBuilder.SetBody[TResponse](ApiCallDetails details, RequestData requestData, Stream responseStream, String mimeType)\r\n   at 
Elasticsearch.Net.ResponseBuilder.ToResponse[TResponse](RequestData requestData, Exception ex, Nullable`1 statusCode, IEnumerable`1 warnings, Stream responseStream, String mimeType)\r\n   at Elasticsearch.Net.HttpWebRequestConnection.Request[TResponse](RequestData 
requestData)\r\n   at Elasticsearch.Net.RequestPipeline.CallElasticsearch[TResponse](RequestData requestData)\r\n   at Elasticsearch.Net.Transport`1.Request[TResponse](HttpMethod method, String path, PostData data, IRequestParameters requestParameters)\r\n   --- 
End of inner exception stack trace ---\r\n   at Elasticsearch.Net.Transport`1.Request[TResponse](HttpMethod method, String path, PostData data, IRequestParameters requestParameters)\r\n   at 
Nest.Specification.SnapshotApi.SnapshotNamespace.VerifyRepository(IVerifyRepositoryRequest request)\r\n   at InforsHT.Genesis.Infrastructure.Data.Repositories.ElasticBackupAndRestoreProxy.IsBackupLocationPresent(String backupLocation) in 
C:\\work\\eve\\Source\\InforsHT.Genesis.Infrastructure.Data\\Repositories\\ElasticBackupAndRestoreProxy.cs:line 44\r\n"

1 Ответ

0 голосов
/ 11 февраля 2020

Это ошибка. Свойство VerifyRepositoryResponse Node имеет атрибут JsonFormatterAttribute, который ожидает десериализацию IDictionary<string, CompactNodeInfo>, когда тип свойства IReadOnlyDictionary<string, CompactNodeInfo>. Это проблематично c для базового сериализатора JSON, который использует строго типизированные форматеры IJsonFormatter<T>, где тип T должен точно соответствовать.

Я открыл проблему для отслеживания и запроса извлечения для устранения проблемы. На данный момент вы сможете обойти ошибку, используя низкоуровневый клиент, выставленный на высокоуровневом клиенте

var response = client.LowLevel.Snapshot.VerifyRepository<DynamicResponse>("C__MYFOLDER_Backup");

и traverse DynamicResponse. В качестве альтернативы, используйте StringResponse и анализируйте, используя JObject или JsonDocument и перемещайтесь.

...