@@ -92,7 +92,7 @@ private bool CheckIdleSession([NotNullWhen(true)] T? session)
9292
9393 private async ValueTask < ISession > RentAsync ( CancellationToken cancellationToken )
9494 {
95- using var ctsGetSession = CancellationTokenSource . CreateLinkedTokenSource ( cancellationToken , _disposeCts . Token ) ;
95+ using var ctsGetSession = CancellationTokenSource . CreateLinkedTokenSource ( cancellationToken ) ;
9696 if ( _createSessionTimeout > 0 )
9797 ctsGetSession . CancelAfter ( TimeSpan . FromSeconds ( _createSessionTimeout ) ) ;
9898
@@ -133,6 +133,10 @@ private async ValueTask<ISession> RentAsync(CancellationToken cancellationToken)
133133 ( ) => waiterTcs . TrySetCanceled ( ) ,
134134 useSynchronizationContext : false
135135 ) ;
136+ await using var disposeRegistration = _disposeCts . Token . Register (
137+ ( ) => waiterTcs . TrySetException ( new YdbException ( "Session Source is disposed." ) ) ,
138+ useSynchronizationContext : false
139+ ) ;
136140 session = await waiterTcs . Task . ConfigureAwait ( false ) ;
137141
138142 if ( CheckIdleSession ( session ) || TryGetIdleSession ( out session ) )
@@ -151,6 +155,11 @@ private async ValueTask<ISession> RentAsync(CancellationToken cancellationToken)
151155 if ( Interlocked . CompareExchange ( ref _numSessions , numSessions + 1 , numSessions ) != numSessions )
152156 continue ;
153157
158+ if ( IsDisposed )
159+ {
160+ break ;
161+ }
162+
154163 try
155164 {
156165 var session = _sessionFactory . NewSession ( this ) ;
@@ -261,16 +270,6 @@ public async ValueTask DisposeAsync()
261270 await _cleanerTimer . DisposeAsync ( ) ;
262271 _disposeCts . Cancel ( ) ;
263272
264- for ( var i = 0 ; i < _maxSessionSize ; i ++ )
265- {
266- var session = Volatile . Read ( ref _sessions [ i ] ) ;
267-
268- if ( session != null && session . CompareAndSet ( PoolingSessionState . In , PoolingSessionState . Clean ) )
269- {
270- CloseSession ( session ) ;
271- }
272- }
273-
274273 var spinWait = new SpinWait ( ) ;
275274 do
276275 {
0 commit comments