@@ -8,33 +8,40 @@ public class YdbImplicitStressTests : TestBase
88{
99 private static IDriver DummyDriver ( ) => new Mock < IDriver > ( MockBehavior . Strict ) . Object ;
1010
11+ private sealed class Counter
12+ {
13+ public int Value ;
14+ public void Inc ( ) => Interlocked . Increment ( ref Value ) ;
15+ }
16+
1117 [ Fact ( Timeout = 30_000 ) ]
1218 public async Task Dispose_WaitsForAllLeases_AndSignalsOnEmptyExactlyOnce ( )
1319 {
1420 var driver = DummyDriver ( ) ;
1521
16- var onEmptyCalls = 0 ;
17- var opened = 0 ;
18- var closed = 0 ;
22+ var onEmpty = new Counter ( ) ;
23+ var opened = new Counter ( ) ;
24+ var closed = new Counter ( ) ;
1925
20- var source = new ImplicitSessionSource ( driver , onEmpty : ( ) => Interlocked . Increment ( ref onEmptyCalls ) ) ;
26+ var source = new ImplicitSessionSource ( driver , onEmpty : onEmpty . Inc ) ;
2127
2228 using var cts = new CancellationTokenSource ( TimeSpan . FromSeconds ( 10 ) ) ;
29+ var token = cts . Token ;
2330
2431 var workers = Enumerable . Range ( 0 , 200 ) . Select ( async i =>
2532 {
26- var rnd = new Random ( unchecked ( i ^ Environment . TickCount ) ) ;
33+ var rnd = new Random ( i ^ Environment . TickCount ) ;
2734 for ( var j = 0 ; j < 10 ; j ++ )
2835 {
2936 try
3037 {
31- var s = await source . OpenSession ( cts . Token ) ;
32- Interlocked . Increment ( ref opened ) ;
38+ var s = await source . OpenSession ( token ) ;
39+ opened . Inc ( ) ;
3340
34- await Task . Delay ( rnd . Next ( 0 , 5 ) , cts . Token ) ;
41+ await Task . Delay ( rnd . Next ( 0 , 5 ) , token ) ;
3542
3643 s . Close ( ) ;
37- Interlocked . Increment ( ref closed ) ;
44+ closed . Inc ( ) ;
3845 }
3946 catch ( ObjectDisposedException )
4047 {
@@ -44,81 +51,81 @@ public async Task Dispose_WaitsForAllLeases_AndSignalsOnEmptyExactlyOnce()
4451
4552 var disposer = Task . Run ( async ( ) =>
4653 {
47- await Task . Delay ( 10 , cts . Token ) ;
54+ await Task . Delay ( 10 , token ) ;
4855 await source . DisposeAsync ( ) ;
49- } , cts . Token ) ;
56+ } , token ) ;
5057
5158 await Task . WhenAll ( workers . Append ( disposer ) ) ;
5259
53- Assert . True ( opened > 0 ) ;
54- Assert . Equal ( opened , closed ) ;
55- Assert . Equal ( 1 , Volatile . Read ( ref onEmptyCalls ) ) ;
60+ Assert . True ( opened . Value > 0 ) ;
61+ Assert . Equal ( opened . Value , closed . Value ) ;
62+ Assert . Equal ( 1 , Volatile . Read ( ref onEmpty . Value ) ) ;
5663
57- await Assert . ThrowsAsync < ObjectDisposedException > (
58- ( ) => source . OpenSession ( CancellationToken . None ) . AsTask ( ) ) ;
64+ await Assert . ThrowsAsync < ObjectDisposedException > ( ( ) => source . OpenSession ( CancellationToken . None ) . AsTask ( ) ) ;
5965 }
60-
66+
6167 [ Fact ( Timeout = 30_000 ) ]
6268 public async Task Stress_Counts_AreBalanced ( )
6369 {
6470 var driver = DummyDriver ( ) ;
6571
66- var opened = 0 ;
67- var closed = 0 ;
68- var onEmptyCalls = 0 ;
72+ var opened = new Counter ( ) ;
73+ var closed = new Counter ( ) ;
74+ var onEmpty = new Counter ( ) ;
6975
70- var source = new ImplicitSessionSource ( driver , onEmpty : ( ) => Interlocked . Increment ( ref onEmptyCalls ) ) ;
76+ var source = new ImplicitSessionSource ( driver , onEmpty : onEmpty . Inc ) ;
7177
7278 using var cts = new CancellationTokenSource ( TimeSpan . FromSeconds ( 10 ) ) ;
79+ var token = cts . Token ;
7380
7481 var workers = Enumerable . Range ( 0 , 200 ) . Select ( async i =>
7582 {
76- var rnd = new Random ( unchecked ( i ^ Environment . TickCount ) ) ;
83+ var rnd = new Random ( i ^ Environment . TickCount ) ;
7784 for ( var j = 0 ; j < 10 ; j ++ )
7885 {
7986 try
8087 {
81- var s = await source . OpenSession ( cts . Token ) ;
82- Interlocked . Increment ( ref opened ) ;
88+ var s = await source . OpenSession ( token ) ;
89+ opened . Inc ( ) ;
8390
84- await Task . Delay ( rnd . Next ( 0 , 3 ) , cts . Token ) ;
91+ await Task . Delay ( rnd . Next ( 0 , 3 ) , token ) ;
8592
8693 s . Close ( ) ;
87- Interlocked . Increment ( ref closed ) ;
94+ closed . Inc ( ) ;
8895 }
8996 catch ( ObjectDisposedException )
9097 {
9198 }
9299 }
93100 } ) . ToArray ( ) ;
94101
95- var disposer = Task . Run ( async ( ) => await source . DisposeAsync ( ) , cts . Token ) ;
102+ var disposer = Task . Run ( async ( ) => await source . DisposeAsync ( ) , token ) ;
96103
97104 await Task . WhenAll ( workers . Append ( disposer ) ) ;
98105
99- Assert . Equal ( opened , closed ) ;
100- Assert . Equal ( 1 , onEmptyCalls ) ;
101- Assert . True ( opened > 0 ) ;
106+ Assert . Equal ( opened . Value , closed . Value ) ;
107+ Assert . Equal ( 1 , onEmpty . Value ) ;
108+ Assert . True ( opened . Value > 0 ) ;
102109
103- await Assert . ThrowsAsync < ObjectDisposedException > (
104- ( ) => source . OpenSession ( CancellationToken . None ) . AsTask ( ) ) ;
110+ await Assert . ThrowsAsync < ObjectDisposedException > ( ( ) => source . OpenSession ( CancellationToken . None ) . AsTask ( ) ) ;
105111 }
106112
107113 [ Fact ( Timeout = 30_000 ) ]
108114 public async Task Open_RacingWithDispose_StateRemainsConsistent ( )
109115 {
110116 var driver = DummyDriver ( ) ;
111117
112- var onEmptyCalls = 0 ;
113- var source = new ImplicitSessionSource ( driver , onEmpty : ( ) => Interlocked . Increment ( ref onEmptyCalls ) ) ;
118+ var onEmpty = new Counter ( ) ;
119+ var source = new ImplicitSessionSource ( driver , onEmpty : onEmpty . Inc ) ;
114120
115121 using var cts = new CancellationTokenSource ( TimeSpan . FromSeconds ( 10 ) ) ;
122+ var token = cts . Token ;
116123
117124 var opens = Enumerable . Range ( 0 , 1000 ) . Select ( async _ =>
118125 {
119126 try
120127 {
121- var s = await source . OpenSession ( cts . Token ) ;
128+ var s = await source . OpenSession ( token ) ;
122129 s . Close ( ) ;
123130 return 1 ;
124131 }
@@ -132,13 +139,12 @@ public async Task Open_RacingWithDispose_StateRemainsConsistent()
132139 {
133140 await Task . Yield ( ) ;
134141 await source . DisposeAsync ( ) ;
135- } , cts . Token ) ;
142+ } , token ) ;
136143
137144 await Task . WhenAll ( opens . Append ( disposeTask ) ) ;
138145
139- Assert . Equal ( 1 , Volatile . Read ( ref onEmptyCalls ) ) ;
146+ Assert . Equal ( 1 , Volatile . Read ( ref onEmpty . Value ) ) ;
140147
141- await Assert . ThrowsAsync < ObjectDisposedException > (
142- ( ) => source . OpenSession ( CancellationToken . None ) . AsTask ( ) ) ;
148+ await Assert . ThrowsAsync < ObjectDisposedException > ( ( ) => source . OpenSession ( CancellationToken . None ) . AsTask ( ) ) ;
143149 }
144150}
0 commit comments