@@ -21,6 +21,7 @@ internal class Writer<TValue> : IWriter<TValue>
2121 private readonly WriterConfig _config ;
2222 private readonly ILogger < Writer < TValue > > _logger ;
2323 private readonly ISerializer < TValue > _serializer ;
24+ private readonly GrpcRequestSettings _writerGrpcRequestSettings ;
2425 private readonly ConcurrentQueue < MessageSending > _toSendBuffer = new ( ) ;
2526 private readonly ConcurrentQueue < MessageSending > _inFlightMessages = new ( ) ;
2627 private readonly CancellationTokenSource _disposeCts = new ( ) ;
@@ -37,6 +38,7 @@ internal Writer(IDriver driver, WriterConfig config, ISerializer<TValue> seriali
3738 _logger = driver . LoggerFactory . CreateLogger < Writer < TValue > > ( ) ;
3839 _serializer = serializer ;
3940 _limitBufferMaxSize = config . BufferMaxSize ;
41+ _writerGrpcRequestSettings = new GrpcRequestSettings { CancellationToken = _disposeCts . Token } ;
4042
4143 StartWriteWorker ( ) ;
4244 }
@@ -49,11 +51,15 @@ public Task<WriteResult> WriteAsync(TValue data, CancellationToken cancellationT
4951 public async Task < WriteResult > WriteAsync ( Message < TValue > message , CancellationToken cancellationToken )
5052 {
5153 TaskCompletionSource < WriteResult > tcs = new ( ) ;
52- cancellationToken . Register (
54+ await using var registrationUserCancellationTokenRegistration = cancellationToken . Register (
5355 ( ) => tcs . TrySetException (
5456 new WriterException ( "The write operation was canceled before it could be completed" )
5557 ) , useSynchronizationContext : false
5658 ) ;
59+ await using var writerDisposedCancellationTokenRegistration = _disposeCts . Token . Register (
60+ ( ) => tcs . TrySetException ( new WriterException ( $ "Writer[{ _config } ] is disposed") ) ,
61+ useSynchronizationContext : false
62+ ) ;
5763
5864 byte [ ] data ;
5965 try
@@ -184,10 +190,7 @@ private async Task Initialize()
184190
185191 _logger . LogInformation ( "Writer session initialization started. WriterConfig: {WriterConfig}" , _config ) ;
186192
187- var stream = _driver . BidirectionalStreamCall (
188- TopicService . StreamWriteMethod ,
189- GrpcRequestSettings . DefaultInstance
190- ) ;
193+ var stream = _driver . BidirectionalStreamCall ( TopicService . StreamWriteMethod , _writerGrpcRequestSettings ) ;
191194
192195 var initRequest = new StreamWriteMessage . Types . InitRequest { Path = _config . TopicPath } ;
193196 if ( _config . ProducerId != null )
@@ -304,22 +307,15 @@ private async Task Initialize()
304307
305308 public void Dispose ( )
306309 {
307- try
308- {
309- _disposeCts . Cancel ( ) ;
310+ _disposeCts . Cancel ( ) ;
310311
311- _session . Dispose ( ) ;
312- }
313- finally
314- {
315- _disposeCts . Dispose ( ) ;
316- }
312+ _session = new NotStartedWriterSession ( "Writer is disposed" ) ;
317313 }
318314}
319315
320316internal record MessageSending ( MessageData MessageData , TaskCompletionSource < WriteResult > Tcs ) ;
321317
322- internal interface IWriteSession : IDisposable
318+ internal interface IWriteSession
323319{
324320 Task Write ( ConcurrentQueue < MessageSending > toSendBuffer ) ;
325321}
@@ -347,11 +343,6 @@ public Task Write(ConcurrentQueue<MessageSending> toSendBuffer)
347343
348344 return Task . CompletedTask ;
349345 }
350-
351- public void Dispose ( )
352- {
353- // Do nothing
354- }
355346}
356347
357348internal class DummyWriterSession : IWriteSession
@@ -362,10 +353,6 @@ private DummyWriterSession()
362353 {
363354 }
364355
365- public void Dispose ( )
366- {
367- }
368-
369356 public Task Write ( ConcurrentQueue < MessageSending > toSendBuffer )
370357 {
371358 return Task . CompletedTask ;
@@ -501,18 +488,16 @@ Completing task on exception...
501488 _inFlightMessages . TryDequeue ( out _ ) ; // Dequeue
502489 }
503490 }
491+
492+ Logger . LogWarning ( "WriterSession[{SessionId}]: stream is closed" , SessionId ) ;
504493 }
505494 catch ( Driver . TransportException e )
506495 {
507496 Logger . LogError ( e , "WriterSession[{SessionId}] have error on processing writeAck" , SessionId ) ;
508-
497+ }
498+ finally
499+ {
509500 ReconnectSession ( ) ;
510-
511- return ;
512501 }
513-
514- Logger . LogWarning ( "WriterSession[{SessionId}]: stream is closed" , SessionId ) ;
515-
516- ReconnectSession ( ) ;
517502 }
518503}
0 commit comments