@@ -104,7 +104,52 @@ public async Task HighContention_OpenClose_NotCanceledException()
104104 }
105105
106106 [ Fact ]
107- public async Task DisposeAsync_Close_Driver ( )
107+ public async Task DisposeAsync_Cancel_WaitersSession ( )
108+ {
109+ const int maxSessionSize = 10 ;
110+ var mockFactory = new MockPoolingSessionFactory ( maxSessionSize ) ;
111+ var sessionSource = new PoolingSessionSource < MockPoolingSession > (
112+ mockFactory , new YdbConnectionStringBuilder { MaxSessionPool = maxSessionSize }
113+ ) ;
114+
115+ var openSessions = new List < ISession > ( ) ;
116+ var waitingSessionTasks = new List < Task > ( ) ;
117+ for ( var i = 0 ; i < maxSessionSize ; i ++ )
118+ {
119+ openSessions . Add ( await sessionSource . OpenSession ( ) ) ;
120+ }
121+
122+ for ( var i = 0 ; i < maxSessionSize ; i ++ )
123+ {
124+ waitingSessionTasks . Add ( Task . Run ( async ( ) =>
125+ {
126+ var session = await sessionSource . OpenSession ( ) ;
127+ await session . Close ( ) ;
128+ } ) ) ;
129+ }
130+
131+ await sessionSource . DisposeAsync ( ) ;
132+ Assert . Equal ( maxSessionSize , mockFactory . NumSession ) ;
133+ Assert . Equal ( "Session Source is disposed." ,
134+ ( await Assert . ThrowsAsync < YdbException > ( async ( ) => await sessionSource . OpenSession ( ) ) ) . Message ) ;
135+
136+ for ( var i = 0 ; i < maxSessionSize ; i ++ )
137+ {
138+ await Assert . ThrowsAsync < TaskCanceledException > ( ( ) => waitingSessionTasks [ i ] ) ;
139+ }
140+
141+ for ( var i = 0 ; i < maxSessionSize ; i ++ )
142+ {
143+ await openSessions [ i ] . Close ( ) ;
144+ }
145+
146+ Assert . Equal ( 0 , mockFactory . NumSession ) ;
147+ Assert . Equal ( "Session Source is disposed." ,
148+ ( await Assert . ThrowsAsync < YdbException > ( async ( ) => await sessionSource . OpenSession ( ) ) ) . Message ) ;
149+ }
150+
151+ [ Fact ]
152+ public async Task StressTest_DisposeAsync_Close_Driver ( )
108153 {
109154 const int contentionTasks = 200 ;
110155 const int maxSessionSize = 100 ;
@@ -113,7 +158,6 @@ public async Task DisposeAsync_Close_Driver()
113158 var disposeCalled = false ;
114159 var mockFactory = new MockPoolingSessionFactory ( maxSessionSize )
115160 {
116- Open = async _ => await Task . Yield ( ) ,
117161 Dispose = ( ) =>
118162 {
119163 Volatile . Write ( ref disposeCalled , true ) ;
@@ -146,6 +190,9 @@ public async Task DisposeAsync_Close_Driver()
146190 {
147191 Assert . Equal ( "Session Source is disposed." , e . Message ) ;
148192 }
193+ catch ( OperationCanceledException )
194+ {
195+ }
149196 } ) ) ;
150197 }
151198
0 commit comments