Skip to content

ElasticLowLevelClient with SniffingConnectionPool fails to make any request due to SniffResponse deserialization failure #3582

@AndrewKostousov

Description

@AndrewKostousov

NEST/Elasticsearch.Net version: 6.5.0 and master

Elasticsearch version: 6.2.3 (I believe server version is irrelevant for this issue)

Description of the problem including expected versus actual behavior:
When using SniffingConnectionPool in ElasticLowLevelClient basically every its method fails with Elasticsearch.Net.PipelineException : Failed sniffing cluster state.

Steps to reproduce:

  1. Add nunit test project to Elasticsearch.sln:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net472</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="nunit" Version="3.11.0" />
    <PackageReference Include="NUnit3TestAdapter" Version="3.11.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Elasticsearch.Net\Elasticsearch.Net.csproj" />
  </ItemGroup>
</Project>
  1. Add test case:
[Test]
public void SniffResponseParsingFailure()
{
  var sniffingConnectionPool = new SniffingConnectionPool(new []{new Uri("http://localhost:9200")});
  var elasticClient = new ElasticLowLevelClient(new ConnectionConfiguration(sniffingConnectionPool));
  var response = elasticClient.ClusterHealth<DynamicResponse>();
  Console.Out.WriteLine(response);
}

Stacktrace obtained on master (SHA-1: 682a8f7):

Elasticsearch.Net.PipelineException : Failed sniffing cluster state.
  ----> System.ArgumentException : Incorrect number of arguments supplied for call to method 'Void set_Item(System.String, Elasticsearch.Net.NodeInfo)'
   at Elasticsearch.Net.RequestPipeline.Sniff() in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Transport\Pipeline\RequestPipeline.cs:line 451
   at Elasticsearch.Net.RequestPipeline.FirstPoolUsage(SemaphoreSlim semaphore) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Transport\Pipeline\RequestPipeline.cs:line 279
   at Elasticsearch.Net.Transport`1.Request[TResponse](HttpMethod method, String path, PostData data, IRequestParameters requestParameters) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Transport\Transport.cs:line 58
   at Elasticsearch.Net.ElasticLowLevelClient.DoRequest[TResponse](HttpMethod method, String path, PostData data, IRequestParameters requestParameters) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\ElasticLowLevelClient.cs:line 45
   at Elasticsearch.Net.ElasticLowLevelClient.ClusterHealth[TResponse](ClusterHealthRequestParameters requestParameters) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\ElasticLowLevelClient.Generated.cs:line 402
   at Tests.Tests.SniffResponseParsingFailure() in C:\projects\open-source\elasticsearch-net\src\NUnitTestProject1\UnitTest1.cs:line 14
--ArgumentException
   at System.Linq.Expressions.Expression.ValidateArgumentCount(MethodBase method, ExpressionType nodeKind, Int32 count, ParameterInfo[] pis)
   at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ReadOnlyCollection`1& arguments)
   at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments)
   at Elasticsearch.Net.ReflectionUtils.GetSetMethodByExpression(PropertyInfo propertyInfo) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 1924
   at Elasticsearch.Net.ReflectionUtils.GetSetMethod(PropertyInfo propertyInfo) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 1891
   at Elasticsearch.Net.PocoJsonSerializerStrategy.SetterValueFactory(Type type) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 1273
   at Elasticsearch.Net.ReflectionUtils.ThreadSafeDictionary`2.AddValue(TKey key) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 1983
   at Elasticsearch.Net.ReflectionUtils.ThreadSafeDictionary`2.Get(TKey key) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 1977
   at Elasticsearch.Net.ReflectionUtils.ThreadSafeDictionary`2.get_Item(TKey key) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 2037
   at Elasticsearch.Net.PocoJsonSerializerStrategy.DeserializeObject(Object value, Type type) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 1380
   at Elasticsearch.Net.ElasticsearchNetJsonStrategy.DeserializeObject(Object value, Type type) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\ElasticsearchNetJsonStrategy.cs:line 123
   at Elasticsearch.Net.PocoJsonSerializerStrategy.DeserializeObject(Object value, Type type) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 1386
   at Elasticsearch.Net.ElasticsearchNetJsonStrategy.DeserializeObject(Object value, Type type) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\ElasticsearchNetJsonStrategy.cs:line 123
   at Elasticsearch.Net.SimpleJson.DeserializeObject(String json, Type type, IJsonSerializerStrategy jsonSerializerStrategy) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\SimpleJson.cs:line 562
   at Elasticsearch.Net.LowLevelRequestResponseSerializer.Deserialize(Type type, Stream stream) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\LowLevelRequestResponseSerializer.cs:line 26
   at Elasticsearch.Net.LowLevelRequestResponseSerializer.Deserialize[T](Stream stream) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Serialization\LowLevelRequestResponseSerializer.cs:line 30
   at Elasticsearch.Net.ResponseBuilder.SetBody[TResponse](ApiCallDetails details, RequestData requestData, Stream responseStream, String mimeType) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Transport\Pipeline\ResponseBuilder.cs:line 103
   at Elasticsearch.Net.ResponseBuilder.ToResponse[TResponse](RequestData requestData, Exception ex, Nullable`1 statusCode, IEnumerable`1 warnings, Stream responseStream, String mimeType) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Transport\Pipeline\ResponseBuilder.cs:line 31
   at Elasticsearch.Net.HttpConnection.Request[TResponse](RequestData requestData) in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Connection\HttpConnection.cs:line 76
   at Elasticsearch.Net.RequestPipeline.Sniff() in C:\projects\open-source\elasticsearch-net\src\Elasticsearch.Net\Transport\Pipeline\RequestPipeline.cs:line 429

Some analysis:

  1. The problem does not appear in Elasticsearch.Net v6.4.0.
  2. I believe it was introduced with PR #3071 where #if NETFX_CORE || DOTNETCORE directive was removed for #define SIMPLE_JSON_TYPEINFO in SimpleJson.cs. At least when I commented out this #define SIMPLE_JSON_TYPEINFO directive my test has passed.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions