Skip to content

Commit e563927

Browse files
fix tests
1 parent 2c3e762 commit e563927

File tree

2 files changed

+51
-8
lines changed

2 files changed

+51
-8
lines changed

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
95+
using var ctsGetSession = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _disposeCts.Token);
9696
if (_createSessionTimeout > 0)
9797
ctsGetSession.CancelAfter(TimeSpan.FromSeconds(_createSessionTimeout));
9898

@@ -133,10 +133,6 @@ private async ValueTask<ISession> RentAsync(CancellationToken cancellationToken)
133133
() => waiterTcs.TrySetCanceled(),
134134
useSynchronizationContext: false
135135
);
136-
await using var disposedCancellationTokenRegistration = _disposeCts.Token.Register(
137-
() => waiterTcs.TrySetException(new YdbException("Session Source is disposed.")),
138-
useSynchronizationContext: false
139-
);
140136
session = await waiterTcs.Task.ConfigureAwait(false);
141137

142138
if (CheckIdleSession(session) || TryGetIdleSession(out session))
@@ -300,7 +296,7 @@ internal abstract class PoolingSessionBase<T> : ISession where T : PoolingSessio
300296
{
301297
private readonly PoolingSessionSource<T> _source;
302298

303-
private int _state = (int)PoolingSessionState.In;
299+
private int _state = (int)PoolingSessionState.Out;
304300

305301
protected PoolingSessionBase(PoolingSessionSource<T> source)
306302
{

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

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)