Skip to content

Commit 381c821

Browse files
fix race condition
1 parent a10fd3f commit 381c821

File tree

3 files changed

+12
-13
lines changed

3 files changed

+12
-13
lines changed

src/Ydb.Sdk/src/Ado/PoolManager.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,7 @@ CancellationToken cancellationToken
2929
}
3030

3131
var newSessionPool = new PoolingSessionSource<PoolingSession>(
32-
new PoolingSessionFactory(
33-
await settings.BuildDriver(),
34-
settings,
35-
settings.LoggerFactory ?? NullLoggerFactory.Instance
36-
),
37-
settings
32+
await PoolingSessionFactory.Create(settings), settings
3833
);
3934

4035
Pools[settings.ConnectionString] = newSessionPool;

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Microsoft.Extensions.Logging;
2+
using Microsoft.Extensions.Logging.Abstractions;
23

34
namespace Ydb.Sdk.Ado.Session;
45

@@ -8,13 +9,16 @@ internal class PoolingSessionFactory : IPoolingSessionFactory<PoolingSession>
89
private readonly bool _disableServerBalancer;
910
private readonly ILogger<PoolingSession> _logger;
1011

11-
public PoolingSessionFactory(IDriver driver, YdbConnectionStringBuilder settings, ILoggerFactory loggerFactory)
12+
private PoolingSessionFactory(IDriver driver, YdbConnectionStringBuilder settings, ILoggerFactory loggerFactory)
1213
{
1314
_driver = driver;
1415
_disableServerBalancer = settings.DisableServerBalancer;
1516
_logger = loggerFactory.CreateLogger<PoolingSession>();
1617
}
1718

19+
public static async Task<PoolingSessionFactory> Create(YdbConnectionStringBuilder settings) =>
20+
new(await settings.BuildDriver(), settings, settings.LoggerFactory ?? NullLoggerFactory.Instance);
21+
1822
public PoolingSession NewSession(PoolingSessionSource<PoolingSession> source) =>
1923
new(_driver, source, _disableServerBalancer, _logger);
2024
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,14 @@ private async ValueTask<ISession> RentAsync(CancellationToken cancellationToken)
9999
_waiters.Enqueue(waiterTcs);
100100
if (_idleSessions.TryPop(out session))
101101
{
102-
if (!waiterTcs.TrySetResult(null) && waiterTcs.Task.IsCompleted)
102+
if (!waiterTcs.TrySetResult(null))
103103
{
104-
var sessionFromRace = waiterTcs.Task.Result;
105-
106-
if (CheckIdleSession(sessionFromRace))
104+
if (waiterTcs.Task.IsCompleted && CheckIdleSession(waiterTcs.Task.Result))
107105
{
108-
_idleSessions.Push(sessionFromRace);
106+
_idleSessions.Push(waiterTcs.Task.Result);
109107
}
108+
109+
WakeUpWaiter();
110110
}
111111

112112
if (CheckIdleSession(session))
@@ -167,7 +167,7 @@ private async ValueTask<ISession> RentAsync(CancellationToken cancellationToken)
167167

168168
private void WakeUpWaiter()
169169
{
170-
if (_waiters.TryDequeue(out var waiter) && waiter.TrySetResult(null))
170+
while (_waiters.TryDequeue(out var waiter) && waiter.TrySetResult(null))
171171
{
172172
} // wake up waiter!
173173
}

0 commit comments

Comments
 (0)