@@ -33,16 +33,13 @@ internal sealed class CommandWriter : IAsyncDisposable
33
33
private readonly bool _trace ;
34
34
private readonly string _name ;
35
35
private readonly NatsConnection _connection ;
36
- private readonly ObjectPool _pool ;
37
- private readonly int _arrayPoolInitialSize ;
38
36
private readonly object _lock = new ( ) ;
39
37
private readonly CancellationTokenSource _cts ;
40
38
private readonly ConnectionStatsCounter _counter ;
41
39
private readonly Memory < byte > _consolidateMem = new byte [ SendMemSize ] . AsMemory ( ) ;
42
40
private readonly TimeSpan _defaultCommandTimeout ;
43
41
private readonly Action < PingCommand > _enqueuePing ;
44
42
private readonly ProtocolWriter _protocolWriter ;
45
- private readonly HeaderWriter _headerWriter ;
46
43
private readonly Channel < int > _channelLock ;
47
44
private readonly Channel < int > _channelSize ;
48
45
private readonly PipeReader _pipeReader ;
@@ -55,25 +52,19 @@ internal sealed class CommandWriter : IAsyncDisposable
55
52
private CancellationTokenSource ? _ctsReader ;
56
53
private volatile bool _disposed ;
57
54
58
- public CommandWriter ( string name , NatsConnection connection , ObjectPool pool , NatsOpts opts , ConnectionStatsCounter counter , Action < PingCommand > enqueuePing , TimeSpan ? overrideCommandTimeout = default )
55
+ public CommandWriter ( string name , NatsConnection connection , NatsOpts opts , ConnectionStatsCounter counter , Action < PingCommand > enqueuePing , TimeSpan ? overrideCommandTimeout = default )
59
56
{
60
57
_logger = opts . LoggerFactory . CreateLogger < CommandWriter > ( ) ;
61
58
_trace = _logger . IsEnabled ( LogLevel . Trace ) ;
62
59
_name = name ;
63
60
_connection = connection ;
64
- _pool = pool ;
65
-
66
- // Derive ArrayPool rent size from buffer size to
67
- // avoid defining another option.
68
- _arrayPoolInitialSize = opts . WriterBufferSize / 256 ;
69
61
70
62
_counter = counter ;
71
63
_defaultCommandTimeout = overrideCommandTimeout ?? opts . CommandTimeout ;
72
64
_enqueuePing = enqueuePing ;
73
65
_protocolWriter = new ProtocolWriter ( opts . SubjectEncoding ) ;
74
66
_channelLock = Channel . CreateBounded < int > ( 1 ) ;
75
67
_channelSize = Channel . CreateUnbounded < int > ( new UnboundedChannelOptions { SingleWriter = true , SingleReader = true } ) ;
76
- _headerWriter = new HeaderWriter ( opts . HeaderEncoding ) ;
77
68
_cts = new CancellationTokenSource ( ) ;
78
69
79
70
var pipe = new Pipe ( new PipeOptions (
@@ -294,49 +285,23 @@ public ValueTask PongAsync(CancellationToken cancellationToken = default)
294
285
return default ;
295
286
}
296
287
297
- public ValueTask PublishAsync < T > ( string subject , T ? value , NatsHeaders ? headers , string ? replyTo , INatsSerialize < T > serializer , CancellationToken cancellationToken )
288
+ public ValueTask PublishAsync ( string subject , ReadOnlyMemory < byte > ? headersBuffer , ReadOnlyMemory < byte > payloadBuffer , string ? replyTo , CancellationToken cancellationToken )
298
289
{
299
290
if ( _trace )
300
291
{
301
292
_logger . LogTrace ( NatsLogEvents . Protocol , "PUB {Subject} {ReplyTo}" , subject , replyTo ) ;
302
293
}
303
294
304
- NatsPooledBufferWriter < byte > ? headersBuffer = null ;
305
- if ( headers != null )
306
- {
307
- if ( ! _pool . TryRent ( out headersBuffer ) )
308
- headersBuffer = new NatsPooledBufferWriter < byte > ( _arrayPoolInitialSize ) ;
309
- }
310
-
311
- NatsPooledBufferWriter < byte > payloadBuffer ;
312
- if ( ! _pool . TryRent ( out payloadBuffer ! ) )
313
- payloadBuffer = new NatsPooledBufferWriter < byte > ( _arrayPoolInitialSize ) ;
314
-
315
295
try
316
296
{
317
- if ( headers != null )
318
- _headerWriter . Write ( headersBuffer ! , headers ) ;
319
-
320
- if ( value != null )
321
- serializer . Serialize ( payloadBuffer , value ) ;
322
-
323
- var size = payloadBuffer . WrittenMemory . Length + ( headersBuffer ? . WrittenMemory . Length ?? 0 ) ;
297
+ var size = payloadBuffer . Length + ( headersBuffer ? . Length ?? 0 ) ;
324
298
if ( _connection . ServerInfo is { } info && size > info . MaxPayload )
325
299
{
326
300
throw new NatsPayloadTooLargeException ( $ "Payload size { size } exceeds server's maximum payload size { info . MaxPayload } ") ;
327
301
}
328
302
}
329
303
catch
330
304
{
331
- payloadBuffer . Reset ( ) ;
332
- _pool . Return ( payloadBuffer ) ;
333
-
334
- if ( headersBuffer != null )
335
- {
336
- headersBuffer . Reset ( ) ;
337
- _pool . Return ( headersBuffer ) ;
338
- }
339
-
340
305
throw ;
341
306
}
342
307
@@ -361,21 +326,12 @@ public ValueTask PublishAsync<T>(string subject, T? value, NatsHeaders? headers,
361
326
throw new ObjectDisposedException ( nameof ( CommandWriter ) ) ;
362
327
}
363
328
364
- _protocolWriter . WritePublish ( _pipeWriter , subject , replyTo , headersBuffer ? . WrittenMemory , payloadBuffer . WrittenMemory ) ;
329
+ _protocolWriter . WritePublish ( _pipeWriter , subject , replyTo , headersBuffer , payloadBuffer ) ;
365
330
EnqueueCommand ( ) ;
366
331
}
367
332
finally
368
333
{
369
334
_semLock . Release ( ) ;
370
-
371
- payloadBuffer . Reset ( ) ;
372
- _pool . Return ( payloadBuffer ) ;
373
-
374
- if ( headersBuffer != null )
375
- {
376
- headersBuffer . Reset ( ) ;
377
- _pool . Return ( headersBuffer ) ;
378
- }
379
335
}
380
336
381
337
return default ;
@@ -815,7 +771,7 @@ private async ValueTask PongStateMachineAsync(bool lockHeld, CancellationToken c
815
771
#if ! NETSTANDARD
816
772
[ AsyncMethodBuilder ( typeof ( PoolingAsyncValueTaskMethodBuilder ) ) ]
817
773
#endif
818
- private async ValueTask PublishStateMachineAsync ( bool lockHeld , string subject , string ? replyTo , NatsPooledBufferWriter < byte > ? headersBuffer , NatsPooledBufferWriter < byte > payloadBuffer , CancellationToken cancellationToken )
774
+ private async ValueTask PublishStateMachineAsync ( bool lockHeld , string subject , string ? replyTo , ReadOnlyMemory < byte > ? headersBuffer , ReadOnlyMemory < byte > payloadBuffer , CancellationToken cancellationToken )
819
775
{
820
776
try
821
777
{
@@ -839,7 +795,7 @@ private async ValueTask PublishStateMachineAsync(bool lockHeld, string subject,
839
795
await _flushTask ! . WaitAsync ( _defaultCommandTimeout , cancellationToken ) . ConfigureAwait ( false ) ;
840
796
}
841
797
842
- _protocolWriter . WritePublish ( _pipeWriter , subject , replyTo , headersBuffer ? . WrittenMemory , payloadBuffer . WrittenMemory ) ;
798
+ _protocolWriter . WritePublish ( _pipeWriter , subject , replyTo , headersBuffer , payloadBuffer ) ;
843
799
EnqueueCommand ( ) ;
844
800
}
845
801
catch ( TimeoutException )
@@ -853,16 +809,9 @@ private async ValueTask PublishStateMachineAsync(bool lockHeld, string subject,
853
809
_semLock . Release ( ) ;
854
810
}
855
811
}
856
- finally
812
+ catch
857
813
{
858
- payloadBuffer . Reset ( ) ;
859
- _pool . Return ( payloadBuffer ) ;
860
-
861
- if ( headersBuffer != null )
862
- {
863
- headersBuffer . Reset ( ) ;
864
- _pool . Return ( headersBuffer ) ;
865
- }
814
+ throw ;
866
815
}
867
816
}
868
817
0 commit comments