1+ using System . Collections . Concurrent ;
12using Xunit ;
23using Ydb . Query ;
34using Ydb . Sdk . Ado . Session ;
@@ -256,9 +257,22 @@ public async Task StressTest_HighContention_OpenClose()
256257 const int maxSessionSize = 50 ;
257258 const int minSessionSize = 10 ;
258259 const int highContentionTasks = maxSessionSize * 5 ;
260+ var sessionIdIsBroken = new ConcurrentDictionary < int , bool > ( ) ;
259261
260262 var mockFactory = new MockPoolingSessionFactory ( maxSessionSize )
261- { IsBroken = ( ) => Random . Shared . NextDouble ( ) < 0.05 } ;
263+ {
264+ IsBroken = sessionNum =>
265+ {
266+ var isBroken = Random . Shared . NextDouble ( ) < 0.05 ;
267+ sessionIdIsBroken [ sessionNum ] = isBroken ;
268+ return isBroken ;
269+ } ,
270+ Open = sessionNum =>
271+ {
272+ sessionIdIsBroken [ sessionNum ] = false ;
273+ return Task . CompletedTask ;
274+ }
275+ } ;
262276 var settings = new YdbConnectionStringBuilder
263277 { MaxSessionPool = maxSessionSize , MinSessionPool = minSessionSize } ;
264278 var sessionSource = new PoolingSessionSource < MockPoolingSession > ( mockFactory , settings ) ;
@@ -273,6 +287,7 @@ public async Task StressTest_HighContention_OpenClose()
273287 while ( ! cts . IsCancellationRequested )
274288 {
275289 var session = await sessionSource . OpenSession ( cts . Token ) ;
290+ Assert . False ( sessionIdIsBroken [ session . SessionId ( ) ] ) ;
276291 session . Close ( ) ;
277292 await Task . Delay ( Random . Shared . Next ( maxSessionSize ) , cts . Token ) ;
278293 }
@@ -312,7 +327,7 @@ public async Task Get_Session_From_Exhausted_Pool()
312327 public async Task Return_IsBroken_Session ( )
313328 {
314329 const int maxSessionSize = 10 ;
315- var mockFactory = new MockPoolingSessionFactory ( maxSessionSize ) { IsBroken = ( ) => true } ;
330+ var mockFactory = new MockPoolingSessionFactory ( maxSessionSize ) { IsBroken = _ => true } ;
316331 var settings = new YdbConnectionStringBuilder
317332 {
318333 MaxSessionPool = maxSessionSize ,
@@ -336,7 +351,7 @@ public async Task CheckIdleSession_WhenIsBrokenInStack_CreateNewSession()
336351 var isBroken = false ;
337352 const int maxSessionSize = 10 ;
338353 // ReSharper disable once AccessToModifiedClosure
339- var mockFactory = new MockPoolingSessionFactory ( maxSessionSize ) { IsBroken = ( ) => isBroken } ;
354+ var mockFactory = new MockPoolingSessionFactory ( maxSessionSize ) { IsBroken = _ => isBroken } ;
340355 var settings = new YdbConnectionStringBuilder
341356 {
342357 MaxSessionPool = maxSessionSize ,
@@ -384,7 +399,7 @@ internal class MockPoolingSessionFactory(int maxSessionSize) : IPoolingSessionFa
384399 internal int NumSession => Volatile . Read ( ref _numSession ) ;
385400
386401 internal Func < int , Task > Open { private get ; init ; } = _ => Task . CompletedTask ;
387- internal Func < bool > IsBroken { private get ; init ; } = ( ) => false ;
402+ internal Func < int , bool > IsBroken { private get ; init ; } = _ => false ;
388403 internal Func < ValueTask > Dispose { private get ; init ; } = ( ) => ValueTask . CompletedTask ;
389404
390405 public MockPoolingSession NewSession ( PoolingSessionSource < MockPoolingSession > source ) =>
@@ -403,7 +418,7 @@ public MockPoolingSession NewSession(PoolingSessionSource<MockPoolingSession> so
403418
404419 return Task . CompletedTask ;
405420 } ,
406- IsBroken ,
421+ ( ) => IsBroken ( _numSession ) ,
407422 Interlocked . Increment ( ref _sessionOpened )
408423 ) ;
409424
0 commit comments