Skip to content

Commit 0df1155

Browse files
committed
Merge branch 'main' into add-implicit-session-flag
2 parents 812a077 + 61ff1a0 commit 0df1155

File tree

5 files changed

+87
-106
lines changed

5 files changed

+87
-106
lines changed

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ namespace Ydb.Sdk.Ado;
66
internal static class PoolManager
77
{
88
private static readonly SemaphoreSlim SemaphoreSlim = new(1); // async mutex
9-
private static readonly ConcurrentDictionary<string, ISessionSource> Pools = new();
9+
10+
internal static readonly ConcurrentDictionary<string, IDriver> Drivers = new();
11+
internal static readonly ConcurrentDictionary<string, ISessionSource> Pools = new();
1012

1113
internal static async Task<ISession> GetSession(
1214
YdbConnectionStringBuilder settings,
@@ -27,9 +29,14 @@ CancellationToken cancellationToken
2729
return await pool.OpenSession(cancellationToken);
2830
}
2931

30-
var newSessionPool = new PoolingSessionSource<PoolingSession>(
31-
await PoolingSessionFactory.Create(settings), settings
32-
);
32+
var driver = Drivers.TryGetValue(settings.GrpcConnectionString, out var cacheDriver) &&
33+
!cacheDriver.IsDisposed
34+
? cacheDriver
35+
: Drivers[settings.GrpcConnectionString] = await settings.BuildDriver();
36+
driver.RegisterOwner();
37+
38+
var factory = new PoolingSessionFactory(driver, settings);
39+
var newSessionPool = new PoolingSessionSource<PoolingSession>(factory, settings);
3340

3441
Pools[settings.ConnectionString] = newSessionPool;
3542

src/Ydb.Sdk/src/Ado/YdbCommand.cs

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -216,31 +216,9 @@ protected override async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBeha
216216
throw new InvalidOperationException("Transaction mismatched! (Maybe using another connection)");
217217
}
218218

219-
var useImplicit = YdbConnection.EnableImplicitSession && transaction is null;
220-
var session = YdbConnection.GetExecutionSession(useImplicit);
221-
222-
YdbDataReader ydbDataReader;
223-
try
224-
{
225-
var execResult = await session.ExecuteQuery(
226-
preparedSql.ToString(),
227-
ydbParameters,
228-
execSettings,
229-
transaction?.TransactionControl
230-
);
231-
232-
ydbDataReader = await YdbDataReader.CreateYdbDataReader(
233-
execResult,
234-
YdbConnection.OnNotSuccessStatusCode,
235-
transaction,
236-
cancellationToken
237-
);
238-
}
239-
finally
240-
{
241-
if (useImplicit)
242-
session.Close();
243-
}
219+
var ydbDataReader = await YdbDataReader.CreateYdbDataReader(await YdbConnection.Session.ExecuteQuery(
220+
preparedSql.ToString(), ydbParameters, execSettings, transaction?.TransactionControl
221+
), YdbConnection.OnNotSuccessStatusCode, transaction, cancellationToken);
244222

245223
YdbConnection.LastReader = ydbDataReader;
246224
YdbConnection.LastCommand = CommandText;

src/Ydb.Sdk/src/Ado/YdbConnection.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,6 @@ internal ISession Session
3838
}
3939

4040
private ISession _session = null!;
41-
42-
internal bool EnableImplicitSession => ConnectionStringBuilder.EnableImplicitSession;
43-
44-
internal ISession GetExecutionSession(bool useImplicit)
45-
=> useImplicit ? new ImplicitSession(Session.Driver) : Session;
46-
47-
internal bool EnableImplicitSession => ConnectionStringBuilder.EnableImplicitSession;
48-
49-
internal ISession GetExecutionSession(bool useImplicit)
50-
=> useImplicit ? PoolManager.GetImplicitSession(ConnectionStringBuilder) : Session;
5141

5242
public YdbConnection()
5343
{

src/Ydb.Sdk/src/Ado/YdbConnectionStringBuilder.cs

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Microsoft.Extensions.Logging;
55
using Microsoft.Extensions.Logging.Abstractions;
66
using Ydb.Sdk.Auth;
7-
using Ydb.Sdk.Pool;
87
using Ydb.Sdk.Transport;
98

109
namespace Ydb.Sdk.Ado;
@@ -29,8 +28,8 @@ private void InitDefaultValues()
2928
_port = 2136;
3029
_database = "/local";
3130
_minSessionPool = 0;
32-
_maxSessionPool = SessionPoolDefaultSettings.MaxSessionPool;
33-
_createSessionTimeout = SessionPoolDefaultSettings.CreateSessionTimeoutSeconds;
31+
_maxSessionPool = 100;
32+
_createSessionTimeout = 5;
3433
_sessionIdleTimeout = 300;
3534
_useTls = false;
3635
_connectTimeout = GrpcDefaultSettings.ConnectTimeoutSeconds;
@@ -41,7 +40,6 @@ private void InitDefaultValues()
4140
_maxReceiveMessageSize = GrpcDefaultSettings.MaxReceiveMessageSize;
4241
_disableDiscovery = GrpcDefaultSettings.DisableDiscovery;
4342
_disableServerBalancer = false;
44-
_enableImplicitSession = false;
4543
}
4644

4745
public string Host
@@ -316,19 +314,7 @@ public int CreateSessionTimeout
316314

317315
private int _createSessionTimeout;
318316

319-
public bool EnableImplicitSession
320-
{
321-
get => _enableImplicitSession;
322-
set
323-
{
324-
_enableImplicitSession = value;
325-
SaveValue(nameof(EnableImplicitSession), value);
326-
}
327-
}
328-
329-
private bool _enableImplicitSession;
330-
331-
public ILoggerFactory? LoggerFactory { get; init; }
317+
public ILoggerFactory LoggerFactory { get; init; } = NullLoggerFactory.Instance;
332318

333319
public ICredentialsProvider? CredentialsProvider { get; init; }
334320

@@ -372,6 +358,12 @@ public override object this[string keyword]
372358

373359
private string Endpoint => $"{(UseTls ? "grpcs" : "grpc")}://{Host}:{Port}";
374360

361+
internal string GrpcConnectionString =>
362+
$"UseTls={UseTls};Host={Host};Port={Port};Database={Database};User={User};Password={Password};" +
363+
$"ConnectTimeout={ConnectTimeout};KeepAlivePingDelay={KeepAlivePingDelay};KeepAlivePingTimeout={KeepAlivePingTimeout};" +
364+
$"EnableMultipleHttp2Connections={EnableMultipleHttp2Connections};MaxSendMessageSize={MaxSendMessageSize};" +
365+
$"MaxReceiveMessageSize={MaxReceiveMessageSize};DisableDiscovery={DisableDiscovery}";
366+
375367
internal async Task<IDriver> BuildDriver()
376368
{
377369
var cert = RootCertificate != null ? X509Certificate.CreateFromCertFile(RootCertificate) : null;
@@ -398,11 +390,10 @@ internal async Task<IDriver> BuildDriver()
398390
MaxSendMessageSize = MaxSendMessageSize,
399391
MaxReceiveMessageSize = MaxReceiveMessageSize
400392
};
401-
var loggerFactory = LoggerFactory ?? NullLoggerFactory.Instance;
402393

403394
return DisableDiscovery
404-
? new DirectGrpcChannelDriver(driverConfig, loggerFactory)
405-
: await Driver.CreateInitialized(driverConfig, loggerFactory);
395+
? new DirectGrpcChannelDriver(driverConfig, LoggerFactory)
396+
: await Driver.CreateInitialized(driverConfig, LoggerFactory);
406397
}
407398

408399
public override void Clear()
@@ -504,9 +495,6 @@ static YdbConnectionOption()
504495
AddOption(new YdbConnectionOption<bool>(BoolExtractor,
505496
(builder, disableServerBalancer) => builder.DisableServerBalancer = disableServerBalancer),
506497
"DisableServerBalancer", "Disable Server Balancer");
507-
AddOption(new YdbConnectionOption<bool>(BoolExtractor,
508-
(builder, enableImplicit) => builder.EnableImplicitSession = enableImplicit),
509-
"EnableImplicitSession", "ImplicitSession");
510498
}
511499

512500
private static void AddOption(YdbConnectionOption option, params string[] keys)

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

Lines changed: 62 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ namespace Ydb.Sdk.Ado.Tests;
44

55
public class YdbConnectionStringBuilderTests
66
{
7+
private const int MessageSize = 64 * 1024 * 1024;
8+
79
[Fact]
810
public void InitDefaultValues_WhenEmptyConstructorInvoke_ReturnDefaultConnectionString()
911
{
@@ -23,12 +25,16 @@ public void InitDefaultValues_WhenEmptyConstructorInvoke_ReturnDefaultConnection
2325
Assert.Equal(10, ydbConnectionStringBuilder.KeepAlivePingTimeout);
2426
Assert.Equal("", ydbConnectionStringBuilder.ConnectionString);
2527
Assert.False(ydbConnectionStringBuilder.EnableMultipleHttp2Connections);
26-
Assert.Equal(64 * 1024 * 1024, ydbConnectionStringBuilder.MaxSendMessageSize);
27-
Assert.Equal(64 * 1024 * 1024, ydbConnectionStringBuilder.MaxReceiveMessageSize);
28+
Assert.Equal(MessageSize, ydbConnectionStringBuilder.MaxSendMessageSize);
29+
Assert.Equal(MessageSize, ydbConnectionStringBuilder.MaxReceiveMessageSize);
2830
Assert.False(ydbConnectionStringBuilder.DisableDiscovery);
2931
Assert.False(ydbConnectionStringBuilder.DisableServerBalancer);
3032
Assert.False(ydbConnectionStringBuilder.UseTls);
31-
Assert.False(ydbConnectionStringBuilder.EnableImplicitSession);
33+
34+
Assert.Equal("UseTls=False;Host=localhost;Port=2136;Database=/local;User=;Password=;ConnectTimeout=5;" +
35+
"KeepAlivePingDelay=10;KeepAlivePingTimeout=10;EnableMultipleHttp2Connections=False;" +
36+
$"MaxSendMessageSize={MessageSize};MaxReceiveMessageSize={MessageSize};DisableDiscovery=False",
37+
ydbConnectionStringBuilder.GrpcConnectionString);
3238
}
3339

3440
[Fact]
@@ -44,69 +50,81 @@ public void InitConnectionStringBuilder_WhenUnexpectedKey_ThrowException()
4450
[Fact]
4551
public void InitConnectionStringBuilder_WhenExpectedKeys_ReturnUpdatedConnectionString()
4652
{
47-
var connectionString = new YdbConnectionStringBuilder(
48-
"Host=server;Port=2135;Database=/my/path;User=Kirill;UseTls=true;" +
49-
"MinSessionPool=10;MaxSessionPool=50;CreateSessionTimeout=30;" +
50-
"SessionIdleTimeout=600;" +
51-
"ConnectTimeout=30;KeepAlivePingDelay=30;KeepAlivePingTimeout=60;" +
52-
"EnableMultipleHttp2Connections=true;" +
53-
"MaxSendMessageSize=1000000;MaxReceiveMessageSize=1000000;" +
54-
"DisableDiscovery=true;DisableServerBalancer=true;EnableImplicitSession=true;"
53+
var ydbConnectionStringBuilder = new YdbConnectionStringBuilder(
54+
"Host=server;Port=2135;Database=/my/path;User=Kirill;UseTls=true;MinSessionPool=10;MaxSessionPool=50;" +
55+
"CreateSessionTimeout=30;SessionIdleTimeout=600;ConnectTimeout=30;KeepAlivePingDelay=30;" +
56+
"KeepAlivePingTimeout=60;EnableMultipleHttp2Connections=true;MaxSendMessageSize=1000000;" +
57+
"MaxReceiveMessageSize=1000000;DisableDiscovery=true;DisableServerBalancer=true;"
5558
);
5659

57-
Assert.Equal(2135, connectionString.Port);
58-
Assert.Equal("server", connectionString.Host);
59-
Assert.Equal("/my/path", connectionString.Database);
60-
Assert.Equal(10, connectionString.MinSessionPool);
61-
Assert.Equal(50, connectionString.MaxSessionPool);
62-
Assert.Equal(30, connectionString.CreateSessionTimeout);
63-
Assert.Equal(600, connectionString.SessionIdleTimeout);
64-
Assert.Equal("Kirill", connectionString.User);
65-
Assert.Equal(30, connectionString.ConnectTimeout);
66-
Assert.Equal(30, connectionString.KeepAlivePingDelay);
67-
Assert.Equal(60, connectionString.KeepAlivePingTimeout);
68-
Assert.Null(connectionString.Password);
69-
Assert.True(connectionString.EnableMultipleHttp2Connections);
70-
Assert.Equal(1000000, connectionString.MaxSendMessageSize);
71-
Assert.Equal(1000000, connectionString.MaxReceiveMessageSize);
60+
Assert.Equal(2135, ydbConnectionStringBuilder.Port);
61+
Assert.Equal("server", ydbConnectionStringBuilder.Host);
62+
Assert.Equal("/my/path", ydbConnectionStringBuilder.Database);
63+
Assert.Equal(10, ydbConnectionStringBuilder.MinSessionPool);
64+
Assert.Equal(50, ydbConnectionStringBuilder.MaxSessionPool);
65+
Assert.Equal(30, ydbConnectionStringBuilder.CreateSessionTimeout);
66+
Assert.Equal(600, ydbConnectionStringBuilder.SessionIdleTimeout);
67+
Assert.Equal("Kirill", ydbConnectionStringBuilder.User);
68+
Assert.Equal(30, ydbConnectionStringBuilder.ConnectTimeout);
69+
Assert.Equal(30, ydbConnectionStringBuilder.KeepAlivePingDelay);
70+
Assert.Equal(60, ydbConnectionStringBuilder.KeepAlivePingTimeout);
71+
Assert.Null(ydbConnectionStringBuilder.Password);
72+
Assert.True(ydbConnectionStringBuilder.EnableMultipleHttp2Connections);
73+
Assert.Equal(1000000, ydbConnectionStringBuilder.MaxSendMessageSize);
74+
Assert.Equal(1000000, ydbConnectionStringBuilder.MaxReceiveMessageSize);
7275
Assert.Equal("Host=server;Port=2135;Database=/my/path;User=Kirill;UseTls=True;" +
7376
"MinSessionPool=10;MaxSessionPool=50;CreateSessionTimeout=30;" +
7477
"SessionIdleTimeout=600;" +
7578
"ConnectTimeout=30;KeepAlivePingDelay=30;KeepAlivePingTimeout=60;" +
7679
"EnableMultipleHttp2Connections=True;" +
7780
"MaxSendMessageSize=1000000;MaxReceiveMessageSize=1000000;" +
78-
"DisableDiscovery=True;DisableServerBalancer=True;EnableImplicitSession=True", connectionString.ConnectionString);
79-
Assert.True(connectionString.DisableDiscovery);
80-
Assert.True(connectionString.DisableServerBalancer);
81-
Assert.True(connectionString.EnableImplicitSession);
81+
"DisableDiscovery=True;DisableServerBalancer=True", ydbConnectionStringBuilder.ConnectionString);
82+
Assert.True(ydbConnectionStringBuilder.DisableDiscovery);
83+
Assert.True(ydbConnectionStringBuilder.DisableServerBalancer);
84+
Assert.Equal("UseTls=True;Host=server;Port=2135;Database=/my/path;User=Kirill;Password=;ConnectTimeout=30;" +
85+
"KeepAlivePingDelay=30;KeepAlivePingTimeout=60;EnableMultipleHttp2Connections=True;" +
86+
"MaxSendMessageSize=1000000;MaxReceiveMessageSize=1000000;DisableDiscovery=True",
87+
ydbConnectionStringBuilder.GrpcConnectionString);
8288
}
8389

8490
[Fact]
8591
public void Host_WhenSetInProperty_ReturnUpdatedConnectionString()
8692
{
87-
var connectionString = new YdbConnectionStringBuilder("Host=server;Port=2135;Database=/my/path;User=Kirill");
88-
89-
Assert.Equal("server", connectionString.Host);
90-
connectionString.Host = "new_server";
91-
Assert.Equal("new_server", connectionString.Host);
92-
93-
Assert.Equal("Host=new_server;Port=2135;Database=/my/path;User=Kirill", connectionString.ConnectionString);
93+
var ydbConnectionStringBuilder =
94+
new YdbConnectionStringBuilder("Host=server;Port=2135;Database=/my/path;User=Kirill");
95+
Assert.Equal(
96+
"UseTls=False;Host=server;Port=2135;Database=/my/path;User=Kirill;Password=;ConnectTimeout=5;" +
97+
"KeepAlivePingDelay=10;KeepAlivePingTimeout=10;EnableMultipleHttp2Connections=False;" +
98+
$"MaxSendMessageSize={MessageSize};MaxReceiveMessageSize={MessageSize};DisableDiscovery=False",
99+
ydbConnectionStringBuilder.GrpcConnectionString);
100+
Assert.Equal("server", ydbConnectionStringBuilder.Host);
101+
ydbConnectionStringBuilder.Host = "new_server";
102+
Assert.Equal("new_server", ydbConnectionStringBuilder.Host);
103+
Assert.Equal(
104+
"UseTls=False;Host=new_server;Port=2135;Database=/my/path;User=Kirill;Password=;ConnectTimeout=5;" +
105+
"KeepAlivePingDelay=10;KeepAlivePingTimeout=10;EnableMultipleHttp2Connections=False;" +
106+
$"MaxSendMessageSize={MessageSize};MaxReceiveMessageSize={MessageSize};DisableDiscovery=False",
107+
ydbConnectionStringBuilder.GrpcConnectionString);
108+
Assert.Equal("Host=new_server;Port=2135;Database=/my/path;User=Kirill",
109+
ydbConnectionStringBuilder.ConnectionString);
94110
}
95111

96112
[Fact]
97113
public void SetProperty_WhenPropertyNeedsTrimOperation_ReturnUpdatedConnectionString()
98114
{
99-
var connectionString =
115+
var ydbConnectionStringBuilder =
100116
new YdbConnectionStringBuilder(" Host =server;Port=2135; EnableMultipleHttp2Connections =true");
101117

102-
Assert.Equal(2135, connectionString.Port);
103-
Assert.Equal("server", connectionString.Host);
104-
Assert.True(connectionString.EnableMultipleHttp2Connections);
118+
Assert.Equal(2135, ydbConnectionStringBuilder.Port);
119+
Assert.Equal("server", ydbConnectionStringBuilder.Host);
120+
Assert.True(ydbConnectionStringBuilder.EnableMultipleHttp2Connections);
105121

106-
Assert.Equal("Host=server;Port=2135;EnableMultipleHttp2Connections=True", connectionString.ConnectionString);
122+
Assert.Equal("Host=server;Port=2135;EnableMultipleHttp2Connections=True",
123+
ydbConnectionStringBuilder.ConnectionString);
107124

108-
connectionString.EnableMultipleHttp2Connections = false;
125+
ydbConnectionStringBuilder.EnableMultipleHttp2Connections = false;
109126

110-
Assert.Equal("Host=server;Port=2135;EnableMultipleHttp2Connections=False", connectionString.ConnectionString);
127+
Assert.Equal("Host=server;Port=2135;EnableMultipleHttp2Connections=False",
128+
ydbConnectionStringBuilder.ConnectionString);
111129
}
112130
}

0 commit comments

Comments
 (0)