Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
2f65a15
feat: PoolingSessionSource 2.0 based on Npgsql pooling algorithm
KirillKurdyukov Jul 17, 2025
099620f
feat: LIFO PoolingSessionSource
KirillKurdyukov Jul 25, 2025
f404e4b
feat: PoolingSessionBase
KirillKurdyukov Jul 25, 2025
59e413d
type safe generic
KirillKurdyukov Jul 25, 2025
a8f82a1
fix
KirillKurdyukov Jul 25, 2025
81d5b43
Added Creating_Session_Throw_Exception
KirillKurdyukov Jul 25, 2025
de93228
commit rebase benchmark
KirillKurdyukov Jul 28, 2025
0bc73f1
fix
KirillKurdyukov Jul 28, 2025
d9454a6
fix
KirillKurdyukov Jul 28, 2025
996f725
fix race condition
KirillKurdyukov Jul 29, 2025
e2d9f75
FIFO LOCK FREE POOL
KirillKurdyukov Jul 29, 2025
fde6685
fix!
KirillKurdyukov Jul 29, 2025
b07a295
fix test
KirillKurdyukov Jul 29, 2025
0fb5d4b
fix test
KirillKurdyukov Jul 29, 2025
032629a
fix
KirillKurdyukov Jul 29, 2025
a8b2a38
added stress test
KirillKurdyukov Jul 30, 2025
4493632
Added more tests
KirillKurdyukov Jul 30, 2025
47b19f3
fix tests
KirillKurdyukov Jul 30, 2025
51cdb75
fix linter
KirillKurdyukov Jul 30, 2025
937cf9f
fix linter
KirillKurdyukov Jul 30, 2025
90c7aae
updates
KirillKurdyukov Jul 31, 2025
1034ddf
fix slip test
KirillKurdyukov Jul 31, 2025
b50c1d3
fix test
KirillKurdyukov Jul 31, 2025
b33975d
fix race
KirillKurdyukov Jul 31, 2025
2944342
fix
KirillKurdyukov Jul 31, 2025
ff916aa
fix
KirillKurdyukov Jul 31, 2025
860ac94
last fixes
KirillKurdyukov Jul 31, 2025
b9f6d28
fix race
KirillKurdyukov Aug 1, 2025
925750f
fix
KirillKurdyukov Aug 1, 2025
e8b6a0c
fix test
KirillKurdyukov Jul 29, 2025
7fd2f23
console;verbosity=detailed
KirillKurdyukov Aug 1, 2025
059f6fe
feat: PoolingSessionSource 2.0 based on Npgsql pooling algorithm
KirillKurdyukov Jul 17, 2025
cc7c810
feat: LIFO PoolingSessionSource
KirillKurdyukov Jul 25, 2025
81bc83a
feat: PoolingSessionBase
KirillKurdyukov Jul 25, 2025
45a5c0b
type safe generic
KirillKurdyukov Jul 25, 2025
a8aa815
fix
KirillKurdyukov Jul 25, 2025
7fb7fd8
Added Creating_Session_Throw_Exception
KirillKurdyukov Jul 25, 2025
27181fc
commit rebase benchmark
KirillKurdyukov Jul 28, 2025
f2dc372
fix
KirillKurdyukov Jul 28, 2025
c040aad
fix
KirillKurdyukov Jul 28, 2025
b8a073a
fix race condition
KirillKurdyukov Jul 29, 2025
1412a0b
FIFO LOCK FREE POOL
KirillKurdyukov Jul 29, 2025
1d8db41
fix!
KirillKurdyukov Jul 29, 2025
b99bc9e
fix test
KirillKurdyukov Jul 29, 2025
5a27b26
fix test
KirillKurdyukov Jul 29, 2025
7bb9188
fix
KirillKurdyukov Jul 29, 2025
632930d
added stress test
KirillKurdyukov Jul 30, 2025
0385216
Added more tests
KirillKurdyukov Jul 30, 2025
15bbbc1
fix tests
KirillKurdyukov Jul 30, 2025
2c35dc4
fix linter
KirillKurdyukov Jul 30, 2025
7b12b93
fix linter
KirillKurdyukov Jul 30, 2025
73f9d29
updates
KirillKurdyukov Jul 31, 2025
ed68729
fix slip test
KirillKurdyukov Jul 31, 2025
ce73a1a
fix test
KirillKurdyukov Jul 31, 2025
81f1d87
fix race
KirillKurdyukov Jul 31, 2025
552b194
fix
KirillKurdyukov Jul 31, 2025
202a8fc
fix
KirillKurdyukov Jul 31, 2025
b0b9f28
last fixes
KirillKurdyukov Jul 31, 2025
d2acfbd
fix race
KirillKurdyukov Aug 1, 2025
9011746
fix
KirillKurdyukov Aug 1, 2025
11f8a6d
Add: functional test results summary (#491)
LiamHamsters Aug 1, 2025
254ee65
fix test
KirillKurdyukov Jul 29, 2025
c51f46b
console;verbosity=detailed
KirillKurdyukov Aug 1, 2025
1ac396f
debug
KirillKurdyukov Aug 1, 2025
7663893
revert on session pool
KirillKurdyukov Aug 1, 2025
9c8b89d
fix test
KirillKurdyukov Aug 1, 2025
b3f4bd6
revert
KirillKurdyukov Aug 1, 2025
40f3b18
revert changes
KirillKurdyukov Aug 1, 2025
fd26b6b
The session source has been shut down.
KirillKurdyukov Aug 1, 2025
7e21419
fix
KirillKurdyukov Aug 1, 2025
e36f9bc
delete unuse check disposing
KirillKurdyukov Aug 1, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/Ydb.Sdk/src/Ado/PoolManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ internal static class PoolManager
private static readonly ConcurrentDictionary<string, SessionPool> Pools = new();

internal static async Task<ISession> GetSession(
YdbConnectionStringBuilder connectionString,
YdbConnectionStringBuilder settings,
CancellationToken cancellationToken
)
{
if (Pools.TryGetValue(connectionString.ConnectionString, out var sessionPool))
if (Pools.TryGetValue(settings.ConnectionString, out var sessionPool))
{
return await sessionPool.GetSession(cancellationToken);
}
Expand All @@ -24,21 +24,21 @@ CancellationToken cancellationToken
{
await SemaphoreSlim.WaitAsync(cancellationToken);

if (Pools.TryGetValue(connectionString.ConnectionString, out var pool))
if (Pools.TryGetValue(settings.ConnectionString, out var pool))
{
return await pool.GetSession(cancellationToken);
}

var newSessionPool = new SessionPool(
await connectionString.BuildDriver(),
await settings.BuildDriver(),
new SessionPoolConfig(
MaxSessionPool: connectionString.MaxSessionPool,
CreateSessionTimeout: connectionString.CreateSessionTimeout,
MaxSessionPool: settings.MaxSessionPool,
CreateSessionTimeout: settings.CreateSessionTimeout,
DisposeDriver: true
)
);

Pools[connectionString.ConnectionString] = newSessionPool;
Pools[settings.ConnectionString] = newSessionPool;

return await newSessionPool.GetSession(cancellationToken);
}
Expand Down
6 changes: 2 additions & 4 deletions src/Ydb.Sdk/src/Ado/Session/ISessionSource.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
namespace Ydb.Sdk.Ado.Session;

internal interface ISessionSource<TSession> where TSession : ISession
internal interface ISessionSource : IAsyncDisposable
{
ValueTask<TSession> OpenSession(CancellationToken cancellationToken);

void Return(TSession session);
ValueTask<ISession> OpenSession(CancellationToken cancellationToken);
}
36 changes: 13 additions & 23 deletions src/Ydb.Sdk/src/Ado/Session/PoolingSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,42 +8,40 @@

namespace Ydb.Sdk.Ado.Session;

internal class PoolingSession : IPoolingSession
internal class PoolingSession : PoolingSessionBase<PoolingSession>
{
private const string SessionBalancer = "session-balancer";

private static readonly TimeSpan DeleteSessionTimeout = TimeSpan.FromSeconds(5);
private static readonly CreateSessionRequest CreateSessionRequest = new();

private readonly PoolingSessionSource _poolingSessionSource;
private readonly ILogger<PoolingSession> _logger;
private readonly bool _disableServerBalancer;

private readonly CancellationTokenSource _attachStreamLifecycleCts = new();

private volatile bool _isBroken = true;
private volatile bool _isBadSession;

private readonly bool _disableServerBalancer;

private string SessionId { get; set; } = string.Empty;
private long NodeId { get; set; }

public IDriver Driver { get; }
public bool IsBroken => _isBroken;
public override IDriver Driver { get; }
public override bool IsBroken => _isBroken;

internal PoolingSession(
IDriver driver,
PoolingSessionSource poolingSessionSource,
PoolingSessionSource<PoolingSession> poolingSessionSource,
bool disableServerBalancer,
ILogger<PoolingSession> logger
)
) : base(poolingSessionSource)
{
_poolingSessionSource = poolingSessionSource;
_disableServerBalancer = disableServerBalancer;
_logger = logger;
Driver = driver;
}

public ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(
public override ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(
string query,
Dictionary<string, YdbValue> parameters,
GrpcRequestSettings settings,
Expand All @@ -65,10 +63,7 @@ public ValueTask<IServerStream<ExecuteQueryResponsePart>> ExecuteQuery(
return Driver.ServerStreamCall(QueryService.ExecuteQueryMethod, request, settings);
}

public async Task CommitTransaction(
string txId,
CancellationToken cancellationToken = default
)
public override async Task CommitTransaction(string txId, CancellationToken cancellationToken = default)
{
var response = await Driver.UnaryCall(
QueryService.CommitTransactionMethod,
Expand All @@ -82,10 +77,7 @@ public async Task CommitTransaction(
}
}

public async Task RollbackTransaction(
string txId,
CancellationToken cancellationToken = default
)
public override async Task RollbackTransaction(string txId, CancellationToken cancellationToken = default)
{
var response = await Driver.UnaryCall(
QueryService.RollbackTransactionMethod,
Expand All @@ -99,7 +91,7 @@ public async Task RollbackTransaction(
}
}

public void OnNotSuccessStatusCode(StatusCode statusCode)
public override void OnNotSuccessStatusCode(StatusCode statusCode)
{
_isBadSession = _isBadSession || statusCode is StatusCode.BadSession;

Expand All @@ -116,7 +108,7 @@ StatusCode.ClientTransportTimeout or
}
}

public async Task Open(CancellationToken cancellationToken)
internal override async Task Open(CancellationToken cancellationToken)
{
var requestSettings = new GrpcRequestSettings { CancellationToken = cancellationToken };

Expand Down Expand Up @@ -217,7 +209,7 @@ public async Task Open(CancellationToken cancellationToken)
await completeTask.Task;
}

public async Task DeleteSession()
internal override async Task DeleteSession()
{
try
{
Expand Down Expand Up @@ -248,6 +240,4 @@ public async Task DeleteSession()
SessionId, NodeId);
}
}

public void Close() => _poolingSessionSource.Return(this);
}
14 changes: 10 additions & 4 deletions src/Ydb.Sdk/src/Ado/Session/PoolingSessionFactory.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;

namespace Ydb.Sdk.Ado.Session;

internal class PoolingSessionFactory : IPoolingSessionFactory
internal class PoolingSessionFactory : IPoolingSessionFactory<PoolingSession>
{
private readonly IDriver _driver;
private readonly bool _disableServerBalancer;
private readonly ILogger<PoolingSession> _logger;

public PoolingSessionFactory(IDriver driver, YdbConnectionStringBuilder settings, ILoggerFactory loggerFactory)
internal PoolingSessionFactory(IDriver driver, YdbConnectionStringBuilder settings, ILoggerFactory loggerFactory)
{
_driver = driver;
_disableServerBalancer = settings.DisableServerBalancer;
_logger = loggerFactory.CreateLogger<PoolingSession>();
}

public IPoolingSession NewSession(PoolingSessionSource source) =>
new PoolingSession(_driver, source, _disableServerBalancer, _logger);
public static async Task<PoolingSessionFactory> Create(YdbConnectionStringBuilder settings) =>
new(await settings.BuildDriver(), settings, settings.LoggerFactory ?? NullLoggerFactory.Instance);

public PoolingSession NewSession(PoolingSessionSource<PoolingSession> source) =>
new(_driver, source, _disableServerBalancer, _logger);

public ValueTask DisposeAsync() => _driver.DisposeAsync();
}
Loading
Loading