Skip to content

Commit f95909b

Browse files
dev: MinSessionPool, SessionIdleTimeout, SessionPruningInterval (#476)
1 parent 81b1a86 commit f95909b

File tree

4 files changed

+91
-16
lines changed

4 files changed

+91
-16
lines changed

src/Ydb.Sdk/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
- Added new ADO.NET options:
2+
- `MinSessionPool`: The minimum connection pool size.
3+
- `SessionIdleTimeout`: The time (in seconds) to wait before closing idle session in the pool if the count of all sessions exceeds `MinSessionPool`.
4+
- `SessionPruningInterval`: How many seconds the pool waits before attempting to prune idle sessions (see `SessionIdleTimeout`).
15
- Fixed bug `Reader`: unhandled exception in `TryReadRequestBytes(long bytes)`.
26
- Handle `YdbException` on `DeleteSession`.
37
- Do not invoke `DeleteSession` if the session is not active.

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

Lines changed: 70 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ private void InitDefaultValues()
2828
_host = YdbAdoDefaultSettings.Host;
2929
_port = YdbAdoDefaultSettings.Port;
3030
_database = YdbAdoDefaultSettings.Database;
31+
_minSessionPool = 0;
3132
_maxSessionPool = SessionPoolDefaultSettings.MaxSessionPool;
33+
_createSessionTimeout = SessionPoolDefaultSettings.CreateSessionTimeoutSeconds;
34+
_sessionIdleTimeout = 300;
35+
_sessionPruningInterval = 10;
3236
_useTls = YdbAdoDefaultSettings.UseTls;
3337
_connectTimeout = GrpcDefaultSettings.ConnectTimeoutSeconds;
3438
_keepAlivePingDelay = GrpcDefaultSettings.KeepAlivePingSeconds;
@@ -37,7 +41,6 @@ private void InitDefaultValues()
3741
_maxSendMessageSize = GrpcDefaultSettings.MaxSendMessageSize;
3842
_maxReceiveMessageSize = GrpcDefaultSettings.MaxReceiveMessageSize;
3943
_disableDiscovery = GrpcDefaultSettings.DisableDiscovery;
40-
_createSessionTimeout = SessionPoolDefaultSettings.CreateSessionTimeoutSeconds;
4144
_disableServerBalancer = false;
4245
}
4346

@@ -123,6 +126,58 @@ public int MaxSessionPool
123126

124127
private int _maxSessionPool;
125128

129+
public int MinSessionPool
130+
{
131+
get => _minSessionPool;
132+
set
133+
{
134+
if (value < 0)
135+
{
136+
throw new ArgumentOutOfRangeException(nameof(value), value, "Invalid min session pool: " + value);
137+
}
138+
139+
_minSessionPool = value;
140+
SaveValue(nameof(MinSessionPool), value);
141+
}
142+
}
143+
144+
private int _minSessionPool;
145+
146+
public int SessionIdleTimeout
147+
{
148+
get => _sessionIdleTimeout;
149+
set
150+
{
151+
if (value < 0)
152+
{
153+
throw new ArgumentOutOfRangeException(nameof(value), value, "Invalid session idle timeout: " + value);
154+
}
155+
156+
_sessionIdleTimeout = value;
157+
SaveValue(nameof(SessionIdleTimeout), value);
158+
}
159+
}
160+
161+
private int _sessionIdleTimeout;
162+
163+
public int SessionPruningInterval
164+
{
165+
get => _sessionPruningInterval;
166+
set
167+
{
168+
if (value <= 0)
169+
{
170+
throw new ArgumentOutOfRangeException(nameof(value), value,
171+
"Invalid session pruning interval: " + value);
172+
}
173+
174+
_sessionPruningInterval = value;
175+
SaveValue(nameof(SessionPruningInterval), value);
176+
}
177+
}
178+
179+
private int _sessionPruningInterval;
180+
126181
public bool UseTls
127182
{
128183
get => _useTls;
@@ -416,9 +471,12 @@ static YdbConnectionOption()
416471
(builder, user) => builder.User = user), "User", "Username", "UserId", "User Id");
417472
AddOption(new YdbConnectionOption<string>(StringExtractor,
418473
(builder, password) => builder.Password = password), "Password", "PWD", "PSW");
419-
AddOption(new YdbConnectionOption<int>(IntExtractor,
420-
(builder, maxSessionPool) => builder.MaxSessionPool = maxSessionPool),
421-
"MaxSessionPool", "Max Session Pool", "Maximum Pool Size", "Max Pool Size", "MaximumPoolSize");
474+
AddOption(new YdbConnectionOption<int>(IntExtractor, (builder, maxSessionPool) =>
475+
builder.MaxSessionPool = maxSessionPool), "MaxSessionPool", "Max Session Pool", "Maximum Pool Size",
476+
"MaximumPoolSize", "Max Pool Size", "MaxPoolSize");
477+
AddOption(new YdbConnectionOption<int>(IntExtractor, (builder, minSessionSize) =>
478+
builder.MinSessionPool = minSessionSize), "MinSessionPool", "Min Session Pool", "Minimum Pool Size",
479+
"MinimumPoolSize", "Min Pool Size", "MinPoolSize");
422480
AddOption(new YdbConnectionOption<bool>(BoolExtractor, (builder, useTls) => builder.UseTls = useTls),
423481
"UseTls", "Use Tls");
424482
AddOption(new YdbConnectionOption<string>(StringExtractor,
@@ -446,8 +504,14 @@ static YdbConnectionOption()
446504
AddOption(new YdbConnectionOption<int>(IntExtractor,
447505
(builder, createSessionTimeout) => builder.CreateSessionTimeout = createSessionTimeout),
448506
"CreateSessionTimeout", "Create Session Timeout");
449-
AddOption(new YdbConnectionOption<bool>(BoolExtractor, (builder, disableServerBalancer) =>
450-
builder.DisableServerBalancer = disableServerBalancer),
507+
AddOption(new YdbConnectionOption<int>(IntExtractor,
508+
(builder, sessionIdleTimeout) => builder.SessionIdleTimeout = sessionIdleTimeout),
509+
"SessionIdleTimeout", "Session Idle Timeout");
510+
AddOption(new YdbConnectionOption<int>(IntExtractor,
511+
(builder, sessionPruningInterval) => builder.SessionPruningInterval = sessionPruningInterval),
512+
"SessionPruningInterval", "Session Pruning Interval");
513+
AddOption(new YdbConnectionOption<bool>(BoolExtractor,
514+
(builder, disableServerBalancer) => builder.DisableServerBalancer = disableServerBalancer),
451515
"DisableServerBalancer", "Disable Server Balancer");
452516
}
453517

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

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ public void InitDefaultValues_WhenEmptyConstructorInvoke_ReturnDefaultConnection
1212
Assert.Equal(2136, ydbConnectionStringBuilder.Port);
1313
Assert.Equal("localhost", ydbConnectionStringBuilder.Host);
1414
Assert.Equal("/local", ydbConnectionStringBuilder.Database);
15+
Assert.Equal(0, ydbConnectionStringBuilder.MinSessionPool);
1516
Assert.Equal(100, ydbConnectionStringBuilder.MaxSessionPool);
17+
Assert.Equal(5, ydbConnectionStringBuilder.CreateSessionTimeout);
18+
Assert.Equal(300, ydbConnectionStringBuilder.SessionIdleTimeout);
19+
Assert.Equal(10, ydbConnectionStringBuilder.SessionPruningInterval);
1620
Assert.Null(ydbConnectionStringBuilder.User);
1721
Assert.Null(ydbConnectionStringBuilder.Password);
1822
Assert.Equal(5, ydbConnectionStringBuilder.ConnectTimeout);
@@ -24,7 +28,6 @@ public void InitDefaultValues_WhenEmptyConstructorInvoke_ReturnDefaultConnection
2428
Assert.Equal(64 * 1024 * 1024, ydbConnectionStringBuilder.MaxReceiveMessageSize);
2529
Assert.False(ydbConnectionStringBuilder.DisableDiscovery);
2630
Assert.False(ydbConnectionStringBuilder.DisableServerBalancer);
27-
Assert.Equal(5, ydbConnectionStringBuilder.CreateSessionTimeout);
2831
Assert.False(ydbConnectionStringBuilder.UseTls);
2932
}
3033

@@ -43,17 +46,22 @@ public void InitConnectionStringBuilder_WhenExpectedKeys_ReturnUpdatedConnection
4346
{
4447
var connectionString = new YdbConnectionStringBuilder(
4548
"Host=server;Port=2135;Database=/my/path;User=Kirill;UseTls=true;" +
49+
"MinSessionPool=10;MaxSessionPool=50;CreateSessionTimeout=30;" +
50+
"SessionIdleTimeout=600;SessionPruningInterval=20;" +
4651
"ConnectTimeout=30;KeepAlivePingDelay=30;KeepAlivePingTimeout=60;" +
47-
"EnableMultipleHttp2Connections=true;CreateSessionTimeout=30;" +
52+
"EnableMultipleHttp2Connections=true;" +
4853
"MaxSendMessageSize=1000000;MaxReceiveMessageSize=1000000;" +
49-
"DisableDiscovery=true;DisableServerBalancer=true;" +
50-
"MaxSessionPool=50"
54+
"DisableDiscovery=true;DisableServerBalancer=true;"
5155
);
5256

5357
Assert.Equal(2135, connectionString.Port);
5458
Assert.Equal("server", connectionString.Host);
5559
Assert.Equal("/my/path", connectionString.Database);
60+
Assert.Equal(10, connectionString.MinSessionPool);
5661
Assert.Equal(50, connectionString.MaxSessionPool);
62+
Assert.Equal(30, connectionString.CreateSessionTimeout);
63+
Assert.Equal(600, connectionString.SessionIdleTimeout);
64+
Assert.Equal(20, connectionString.SessionPruningInterval);
5765
Assert.Equal("Kirill", connectionString.User);
5866
Assert.Equal(30, connectionString.ConnectTimeout);
5967
Assert.Equal(30, connectionString.KeepAlivePingDelay);
@@ -63,15 +71,14 @@ public void InitConnectionStringBuilder_WhenExpectedKeys_ReturnUpdatedConnection
6371
Assert.Equal(1000000, connectionString.MaxSendMessageSize);
6472
Assert.Equal(1000000, connectionString.MaxReceiveMessageSize);
6573
Assert.Equal("Host=server;Port=2135;Database=/my/path;User=Kirill;UseTls=True;" +
74+
"MinSessionPool=10;MaxSessionPool=50;CreateSessionTimeout=30;" +
75+
"SessionIdleTimeout=600;SessionPruningInterval=20;" +
6676
"ConnectTimeout=30;KeepAlivePingDelay=30;KeepAlivePingTimeout=60;" +
67-
"EnableMultipleHttp2Connections=True;CreateSessionTimeout=30;" +
77+
"EnableMultipleHttp2Connections=True;" +
6878
"MaxSendMessageSize=1000000;MaxReceiveMessageSize=1000000;" +
69-
"DisableDiscovery=True;DisableServerBalancer=True;" +
70-
"MaxSessionPool=50", connectionString.ConnectionString);
79+
"DisableDiscovery=True;DisableServerBalancer=True", connectionString.ConnectionString);
7180
Assert.True(connectionString.DisableDiscovery);
7281
Assert.True(connectionString.DisableServerBalancer);
73-
Assert.Equal(30, connectionString.CreateSessionTimeout);
74-
Assert.Equal(50, connectionString.MaxSessionPool);
7582
}
7683

7784
[Fact]

src/Ydb.Sdk/test/Ydb.Sdk.Topic.Tests/ReaderUnitTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1093,7 +1093,7 @@ public async Task
10931093

10941094
_mockStream.Verify(stream => stream.Write(It.Is<FromClient>(msg =>
10951095
msg.InitRequest != null && msg.InitRequest.Consumer == "Consumer" &&
1096-
msg.InitRequest.TopicsReadSettings[0].Path == "/topic")), Times.Between(2, 3, Range.Inclusive));
1096+
msg.InitRequest.TopicsReadSettings[0].Path == "/topic")), Times.AtLeast(2));
10971097
_mockStream.Verify(stream => stream.Write(It.Is<FromClient>(msg =>
10981098
msg.ReadRequest != null && msg.ReadRequest.BytesSize == 100)), Times.Exactly(2));
10991099
_mockStream.Verify(stream => stream.Write(It.Is<FromClient>(msg =>

0 commit comments

Comments
 (0)