Skip to content

Commit ff916aa

Browse files
fix
1 parent 2944342 commit ff916aa

File tree

3 files changed

+39
-22
lines changed

3 files changed

+39
-22
lines changed

src/Ydb.Sdk/src/Ado/Session/PoolingSessionSource.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ private bool TryGetIdleSession([NotNullWhen(true)] out T? session)
7575
[MethodImpl(MethodImplOptions.AggressiveInlining)]
7676
private bool CheckIdleSession([NotNullWhen(true)] T? session)
7777
{
78-
if (session == null || session.State == PoolingSessionState.Clean)
78+
if (session == null)
7979
{
8080
return false;
8181
}
@@ -312,12 +312,10 @@ protected PoolingSessionBase(PoolingSessionSource<T> source)
312312
}
313313

314314
internal bool CompareAndSet(PoolingSessionState expected, PoolingSessionState actual) =>
315-
Interlocked.CompareExchange(ref _state, (int)expected, (int)actual) == (int)expected;
315+
Interlocked.CompareExchange(ref _state, (int)actual, (int)expected) == (int)expected;
316316

317317
internal void Set(PoolingSessionState state) => Interlocked.Exchange(ref _state, (int)state);
318318

319-
internal PoolingSessionState State => (PoolingSessionState)Volatile.Read(ref _state);
320-
321319
internal DateTime IdleStartTime { get; set; }
322320

323321
public abstract IDriver Driver { get; }

src/Ydb.Sdk/test/Ydb.Sdk.Ado.Tests/Session/PoolingSessionSourceMockTests.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Concurrent;
12
using Xunit;
23
using Ydb.Query;
34
using 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

src/Ydb.Sdk/test/Ydb.Sdk.Ado.Tests/YdbConnectionTests.cs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,23 @@ public sealed class YdbConnectionTests : TestBase
1919
[Fact]
2020
public async Task ClearPool_WhenHasActiveConnection_CloseActiveConnectionOnClose()
2121
{
22-
var connectionString = ConnectionString + ";MaxSessionPool=100";
23-
24-
var tasks = GenerateTasks(connectionString);
25-
tasks.Add(YdbConnection.ClearPool(new YdbConnection(connectionString)));
26-
tasks.AddRange(GenerateTasks(connectionString));
27-
await Task.WhenAll(tasks);
28-
Assert.Equal(999000, _counter);
29-
30-
tasks = GenerateTasks(connectionString);
31-
tasks.Add(YdbConnection.ClearPool(new YdbConnection(connectionString)));
32-
await Task.WhenAll(tasks);
33-
Assert.Equal(1498500, _counter);
34-
await YdbConnection.ClearPool(new YdbConnection(connectionString));
22+
for (var i = 0; i < 10; i++)
23+
{
24+
var connectionString = ConnectionString + ";MaxSessionPool=100";
25+
26+
var tasks = GenerateTasks(connectionString);
27+
tasks.Add(YdbConnection.ClearPool(new YdbConnection(connectionString)));
28+
tasks.AddRange(GenerateTasks(connectionString));
29+
await Task.WhenAll(tasks);
30+
Assert.Equal(999000, _counter);
31+
32+
tasks = GenerateTasks(connectionString);
33+
tasks.Add(YdbConnection.ClearPool(new YdbConnection(connectionString)));
34+
await Task.WhenAll(tasks);
35+
Assert.Equal(1498500, _counter);
36+
await YdbConnection.ClearPool(new YdbConnection(connectionString));
37+
_counter = 0;
38+
}
3539
}
3640

3741
// docker cp ydb-local:/ydb_certs/ca.pem ~/

0 commit comments

Comments
 (0)