From f4c35c6e0ff41feeed82b6f9bc8d3b896067128e Mon Sep 17 00:00:00 2001 From: Martijn Laarman Date: Mon, 11 Nov 2019 11:35:25 +0100 Subject: [PATCH] Allow MemoryStreamFactory to be pluggable --- .../FixedPipelineFactory.cs | 4 ++-- .../Configuration/ConnectionConfiguration.cs | 8 +++++++- src/Elasticsearch.Net/Providers/MemoryStreamFactory.cs | 3 +++ .../Serialization/ElasticsearchSerializerExtensions.cs | 4 ++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Auxiliary/Elasticsearch.Net.VirtualizedCluster/FixedPipelineFactory.cs b/src/Auxiliary/Elasticsearch.Net.VirtualizedCluster/FixedPipelineFactory.cs index 227550a3172..935170032b1 100644 --- a/src/Auxiliary/Elasticsearch.Net.VirtualizedCluster/FixedPipelineFactory.cs +++ b/src/Auxiliary/Elasticsearch.Net.VirtualizedCluster/FixedPipelineFactory.cs @@ -5,7 +5,7 @@ public class FixedPipelineFactory : IRequestPipelineFactory public FixedPipelineFactory(IConnectionConfigurationValues connectionSettings, IDateTimeProvider dateTimeProvider) { DateTimeProvider = dateTimeProvider; - MemoryStreamFactory = new MemoryStreamFactory(); + MemoryStreamFactory = RecyclableMemoryStreamFactory.Default; Settings = connectionSettings; Pipeline = Create(Settings, DateTimeProvider, MemoryStreamFactory, new SearchRequestParameters()); @@ -16,7 +16,7 @@ public FixedPipelineFactory(IConnectionConfigurationValues connectionSettings, I public IRequestPipeline Pipeline { get; } private IDateTimeProvider DateTimeProvider { get; } - private MemoryStreamFactory MemoryStreamFactory { get; } + private IMemoryStreamFactory MemoryStreamFactory { get; } private IConnectionConfigurationValues Settings { get; } private Transport Transport => diff --git a/src/Elasticsearch.Net/Configuration/ConnectionConfiguration.cs b/src/Elasticsearch.Net/Configuration/ConnectionConfiguration.cs index 0d6921120d3..629e51c1fe7 100644 --- a/src/Elasticsearch.Net/Configuration/ConnectionConfiguration.cs +++ b/src/Elasticsearch.Net/Configuration/ConnectionConfiguration.cs @@ -158,6 +158,7 @@ public abstract class ConnectionConfiguration : IConnectionConfigurationValue private bool _sniffOnStartup; private bool _throwExceptions; private bool _transferEncodingChunked; + private IMemoryStreamFactory _memoryStreamFactory = RecyclableMemoryStreamFactory.Default; private string _userAgent = ConnectionConfiguration.DefaultUserAgent; private Func _statusCodeToResponseSuccess; @@ -209,7 +210,7 @@ protected ConnectionConfiguration(IConnectionPool connectionPool, IConnection co TimeSpan? IConnectionConfigurationValues.MaxDeadTimeout => _maxDeadTimeout; int? IConnectionConfigurationValues.MaxRetries => _maxRetries; TimeSpan? IConnectionConfigurationValues.MaxRetryTimeout => _maxRetryTimeout; - IMemoryStreamFactory IConnectionConfigurationValues.MemoryStreamFactory { get; } = RecyclableMemoryStreamFactory.Default; + IMemoryStreamFactory IConnectionConfigurationValues.MemoryStreamFactory => _memoryStreamFactory; Func IConnectionConfigurationValues.NodePredicate => _nodePredicate; Action IConnectionConfigurationValues.OnRequestCompleted => _completedRequestHandler; @@ -557,6 +558,11 @@ public T SkipDeserializationForStatusCodes(params int[] statusCodes) => /// public T TransferEncodingChunked(bool transferEncodingChunked = true) => Assign(transferEncodingChunked, (a, v) => a._transferEncodingChunked = v); + /// + /// The memory stream factory to use, defaults to + /// + public T MemoryStreamFactory(IMemoryStreamFactory memoryStreamFactory) => Assign(memoryStreamFactory, (a, v) => a._memoryStreamFactory = v); + protected virtual void DisposeManagedResources() { _connectionPool?.Dispose(); diff --git a/src/Elasticsearch.Net/Providers/MemoryStreamFactory.cs b/src/Elasticsearch.Net/Providers/MemoryStreamFactory.cs index af49d608aeb..902e7d3f0b8 100644 --- a/src/Elasticsearch.Net/Providers/MemoryStreamFactory.cs +++ b/src/Elasticsearch.Net/Providers/MemoryStreamFactory.cs @@ -2,11 +2,14 @@ namespace Elasticsearch.Net { + // TODO we use this in some places but its no longer clear to me why need to circumvent RecyclableMemoryStream in some cases /// /// A factory for creating memory streams using instances of /// public class MemoryStreamFactory : IMemoryStreamFactory { + public static MemoryStreamFactory Default { get; } = new MemoryStreamFactory(); + /// public MemoryStream Create() => new MemoryStream(); diff --git a/src/Elasticsearch.Net/Serialization/ElasticsearchSerializerExtensions.cs b/src/Elasticsearch.Net/Serialization/ElasticsearchSerializerExtensions.cs index a32d4e8f4ab..e1830f0071f 100644 --- a/src/Elasticsearch.Net/Serialization/ElasticsearchSerializerExtensions.cs +++ b/src/Elasticsearch.Net/Serialization/ElasticsearchSerializerExtensions.cs @@ -27,7 +27,7 @@ public static byte[] SerializeToBytes( SerializationFormatting formatting = SerializationFormatting.None ) { - memoryStreamFactory = memoryStreamFactory ?? RecyclableMemoryStreamFactory.Default; + memoryStreamFactory ??= RecyclableMemoryStreamFactory.Default; using (var ms = memoryStreamFactory.Create()) { serializer.Serialize(data, ms, formatting); @@ -58,7 +58,7 @@ public static string SerializeToString( SerializationFormatting formatting = SerializationFormatting.None ) { - memoryStreamFactory = memoryStreamFactory ?? RecyclableMemoryStreamFactory.Default; + memoryStreamFactory ??= RecyclableMemoryStreamFactory.Default; using (var ms = memoryStreamFactory.Create()) { serializer.Serialize(data, ms, formatting);