Skip to content

Commit 56df803

Browse files
Added ConnectTimeout: time to wait (in seconds) while trying to establish a connection.
1 parent f7b6dfb commit 56df803

File tree

6 files changed

+37
-4
lines changed

6 files changed

+37
-4
lines changed

src/Ydb.Sdk/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
- Added `ConnectTimeout`: time to wait (in seconds) while trying to establish a connection.
2+
13
## v0.18.2
24

35
- Fixed YdbException: propagate inner exception.

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ private void InitDefaultValues()
2929
_database = "/local";
3030
_maxSessionPool = 100;
3131
_useTls = false;
32+
_connectTimeout = GrpcDefaultSettings.ConnectTimeoutSeconds;
3233
_keepAlivePingDelay = GrpcDefaultSettings.DefaultKeepAlivePingSeconds;
3334
_keepAlivePingTimeout = GrpcDefaultSettings.DefaultKeepAlivePingTimeoutSeconds;
3435
_enableMultipleHttp2Connections = false;
@@ -145,6 +146,23 @@ public string? RootCertificate
145146

146147
private string? _rootCertificate;
147148

149+
public int ConnectTimeout
150+
{
151+
get => _connectTimeout;
152+
set
153+
{
154+
if (value < 0)
155+
{
156+
throw new ArgumentOutOfRangeException(nameof(value), value, "Invalid connect timeout: " + value);
157+
}
158+
159+
_connectTimeout = value;
160+
SaveValue(nameof(ConnectTimeout), value);
161+
}
162+
}
163+
164+
private int _connectTimeout;
165+
148166
public int KeepAlivePingDelay
149167
{
150168
get => _keepAlivePingDelay;
@@ -283,6 +301,9 @@ internal async Task<IDriver> BuildDriver()
283301
customServerCertificates: ServerCertificates
284302
)
285303
{
304+
ConnectTimeout = ConnectTimeout == 0
305+
? Timeout.InfiniteTimeSpan
306+
: TimeSpan.FromSeconds(ConnectTimeout),
286307
KeepAlivePingDelay = KeepAlivePingDelay == 0
287308
? Timeout.InfiniteTimeSpan
288309
: TimeSpan.FromSeconds(KeepAlivePingDelay),
@@ -367,10 +388,12 @@ static YdbConnectionOption()
367388
"MaxSessionPool", "Max Session Pool", "Maximum Pool Size", "Max Pool Size", "MaximumPoolSize");
368389
AddOption(new YdbConnectionOption<bool>(BoolExtractor, (builder, useTls) => builder.UseTls = useTls),
369390
"UseTls", "Use Tls");
370-
AddOption(
371-
new YdbConnectionOption<string>(StringExtractor,
391+
AddOption(new YdbConnectionOption<string>(StringExtractor,
372392
(builder, rootCertificate) => builder.RootCertificate = rootCertificate),
373393
"RootCertificate", "Root Certificate");
394+
AddOption(new YdbConnectionOption<int>(IntExtractor,
395+
(builder, connectTimeout) => builder.ConnectTimeout = connectTimeout),
396+
"ConnectTimeout", "Connect Timeout");
374397
AddOption(new YdbConnectionOption<int>(IntExtractor,
375398
(builder, keepAlivePingDelay) => builder.KeepAlivePingDelay = keepAlivePingDelay),
376399
"KeepAlivePingDelay", "Keep Alive Ping Delay");

src/Ydb.Sdk/src/DriverConfig.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ public class DriverConfig
1010
public string Database { get; }
1111
public ICredentialsProvider? Credentials { get; }
1212

13+
public TimeSpan ConnectTimeout { get; init; } =
14+
TimeSpan.FromSeconds(GrpcDefaultSettings.ConnectTimeoutSeconds);
15+
1316
public TimeSpan KeepAlivePingDelay { get; init; } =
1417
TimeSpan.FromSeconds(GrpcDefaultSettings.DefaultKeepAlivePingSeconds);
1518

src/Ydb.Sdk/src/GrpcDefaultSettings.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ internal static class GrpcDefaultSettings
1515
internal const int MaxSendMessageSize = 64 * 1024 * 1024; // 64 Mb
1616

1717
internal const int MaxReceiveMessageSize = 64 * 1024 * 1024; // 64 Mb
18+
19+
internal const int ConnectTimeoutSeconds = 5;
1820
}

src/Ydb.Sdk/src/Pool/ChannelPool.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ public GrpcChannel CreateChannel(string endpoint)
102102

103103
var httpHandler = new SocketsHttpHandler
104104
{
105+
ConnectTimeout = _config.ConnectTimeout,
105106
// https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md
106107
KeepAlivePingDelay = _config.KeepAlivePingDelay,
107108
KeepAlivePingTimeout = _config.KeepAlivePingTimeout,

src/Ydb.Sdk/tests/Ado/YdbConnectionStringBuilderTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public void InitDefaultValues_WhenEmptyConstructorInvoke_ReturnDefaultConnection
1616
Assert.Equal(100, ydbConnectionStringBuilder.MaxSessionPool);
1717
Assert.Null(ydbConnectionStringBuilder.User);
1818
Assert.Null(ydbConnectionStringBuilder.Password);
19+
Assert.Equal(5, ydbConnectionStringBuilder.ConnectTimeout);
1920
Assert.Equal(10, ydbConnectionStringBuilder.KeepAlivePingDelay);
2021
Assert.Equal(10, ydbConnectionStringBuilder.KeepAlivePingTimeout);
2122
Assert.Equal("", ydbConnectionStringBuilder.ConnectionString);
@@ -40,7 +41,7 @@ public void InitConnectionStringBuilder_WhenExpectedKeys_ReturnUpdatedConnection
4041
{
4142
var connectionString =
4243
new YdbConnectionStringBuilder("Host=server;Port=2135;Database=/my/path;User=Kirill;UseTls=true;" +
43-
"KeepAlivePingDelay=30;KeepAlivePingTimeout=60;" +
44+
"ConnectTimeout=30;KeepAlivePingDelay=30;KeepAlivePingTimeout=60;" +
4445
"EnableMultipleHttp2Connections=true;" +
4546
"MaxSendMessageSize=1000000;MaxReceiveMessageSize=1000000;" +
4647
"DisableDiscovery=true");
@@ -50,14 +51,15 @@ public void InitConnectionStringBuilder_WhenExpectedKeys_ReturnUpdatedConnection
5051
Assert.Equal("/my/path", connectionString.Database);
5152
Assert.Equal(100, connectionString.MaxSessionPool);
5253
Assert.Equal("Kirill", connectionString.User);
54+
Assert.Equal(30, connectionString.ConnectTimeout);
5355
Assert.Equal(30, connectionString.KeepAlivePingDelay);
5456
Assert.Equal(60, connectionString.KeepAlivePingTimeout);
5557
Assert.Null(connectionString.Password);
5658
Assert.True(connectionString.EnableMultipleHttp2Connections);
5759
Assert.Equal(1000000, connectionString.MaxSendMessageSize);
5860
Assert.Equal(1000000, connectionString.MaxReceiveMessageSize);
5961
Assert.Equal("Host=server;Port=2135;Database=/my/path;User=Kirill;UseTls=True;" +
60-
"KeepAlivePingDelay=30;KeepAlivePingTimeout=60;" +
62+
"ConnectTimeout=30;KeepAlivePingDelay=30;KeepAlivePingTimeout=60;" +
6163
"EnableMultipleHttp2Connections=True;" +
6264
"MaxSendMessageSize=1000000;MaxReceiveMessageSize=1000000;" +
6365
"DisableDiscovery=True", connectionString.ConnectionString);

0 commit comments

Comments
 (0)