Skip to content

Commit 361f565

Browse files
feat(csharp): expose http_request_timeout as configurable parameter
Add `adbc.databricks.http_request_timeout` parameter to allow users to configure the per-request timeout for dead connection detection. Default remains 900s (15 min) matching JDBC socketTimeout. Set to 0 to disable. Co-authored-by: Isaac
1 parent 0c1f36d commit 361f565

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

csharp/src/DatabricksConnection.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,11 @@ protected internal override bool TrySetGetDirectResults(IRequest request)
397397
/// </summary>
398398
protected int RateLimitRetryTimeout { get; private set; } = DatabricksConstants.DefaultRateLimitRetryTimeout;
399399

400+
/// <summary>
401+
/// Gets the per-request timeout in seconds to detect dead connections.
402+
/// </summary>
403+
protected int HttpRequestTimeout { get; private set; } = DatabricksConstants.DefaultHttpRequestTimeout;
404+
400405
protected override HttpMessageHandler CreateHttpHandler()
401406
{
402407
HttpMessageHandler baseHandler = base.CreateHttpHandler();
@@ -417,6 +422,7 @@ protected override HttpMessageHandler CreateHttpHandler()
417422
TemporarilyUnavailableRetryTimeout = TemporarilyUnavailableRetryTimeout,
418423
RateLimitRetry = RateLimitRetry,
419424
RateLimitRetryTimeout = RateLimitRetryTimeout,
425+
HttpRequestTimeout = HttpRequestTimeout,
420426
TimeoutMinutes = 1,
421427
AddThriftErrorHandler = true
422428
};
@@ -939,6 +945,17 @@ protected override void ValidateOptions()
939945
RateLimitRetryTimeout = rateLimitRetryTimeoutValue;
940946
}
941947

948+
if (Properties.TryGetValue(DatabricksParameters.HttpRequestTimeout, out string? httpRequestTimeoutStr))
949+
{
950+
if (!int.TryParse(httpRequestTimeoutStr, out int httpRequestTimeoutValue) ||
951+
httpRequestTimeoutValue < 0)
952+
{
953+
throw new ArgumentOutOfRangeException(DatabricksParameters.HttpRequestTimeout, httpRequestTimeoutStr,
954+
$"must be a value of 0 (disabled) or a positive integer representing seconds. Default is 900 seconds (15 minutes).");
955+
}
956+
HttpRequestTimeout = httpRequestTimeoutValue;
957+
}
958+
942959
// When TemporarilyUnavailableRetry is enabled, we need to make sure connection timeout (which is used to cancel the HttpConnection) is equal
943960
// or greater than TemporarilyUnavailableRetryTimeout so that it won't timeout before server startup timeout (TemporarilyUnavailableRetryTimeout)
944961
if (TemporarilyUnavailableRetry && TemporarilyUnavailableRetryTimeout * 1000 > ConnectTimeoutMilliseconds)

csharp/src/DatabricksParameters.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,14 @@ public class DatabricksParameters : SparkParameters
135135
/// </summary>
136136
public const string RateLimitRetryTimeout = "adbc.databricks.rate_limit_retry_timeout";
137137

138+
/// <summary>
139+
/// Per-request timeout in seconds to detect dead connections (e.g., half-open TCP).
140+
/// When a connection hangs without sending data, this timeout fires to cancel the request
141+
/// and allow retry. Default value is 900 seconds (15 minutes), matching JDBC socketTimeout.
142+
/// Set to 0 to disable the per-request timeout.
143+
/// </summary>
144+
public const string HttpRequestTimeout = "adbc.databricks.http_request_timeout";
145+
138146
/// <summary>
139147
/// Maximum number of parallel downloads for CloudFetch operations.
140148
/// Default value is 3 if not specified.
@@ -421,6 +429,12 @@ public class DatabricksConstants
421429
/// </summary>
422430
public const int DefaultRateLimitRetryTimeout = 120; // 2 minutes
423431

432+
/// <summary>
433+
/// Default per-request timeout in seconds to detect dead connections.
434+
/// Matches JDBC driver's socketTimeout=900.
435+
/// </summary>
436+
public const int DefaultHttpRequestTimeout = 900; // 15 minutes
437+
424438
/// <summary>
425439
/// Default timeout in minutes for CloudFetch HTTP operations.
426440
/// </summary>

csharp/src/Http/HttpHandlerFactory.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ internal class HandlerConfig
9999
/// </summary>
100100
public int RateLimitRetryTimeout { get; set; }
101101

102+
/// <summary>
103+
/// Per-request timeout in seconds to detect dead connections.
104+
/// </summary>
105+
public int HttpRequestTimeout { get; set; } = DatabricksConstants.DefaultHttpRequestTimeout;
106+
102107
/// <summary>
103108
/// Timeout in minutes for HTTP operations.
104109
/// </summary>
@@ -314,14 +319,16 @@ public static HandlerCreationResult CreateHandlersWithTokenProvider(HandlerConfi
314319
config.TemporarilyUnavailableRetryTimeout,
315320
config.RateLimitRetryTimeout,
316321
config.TemporarilyUnavailableRetry,
317-
config.RateLimitRetry);
322+
config.RateLimitRetry,
323+
httpRequestTimeoutSeconds: config.HttpRequestTimeout);
318324
authHandler = new RetryHttpHandler(
319325
authHandler,
320326
config.ActivityTracer,
321327
config.TemporarilyUnavailableRetryTimeout,
322328
config.RateLimitRetryTimeout,
323329
config.TemporarilyUnavailableRetry,
324-
config.RateLimitRetry);
330+
config.RateLimitRetry,
331+
httpRequestTimeoutSeconds: config.HttpRequestTimeout);
325332
}
326333

327334
// Add Thrift error handler if requested (for Thrift connections only)

0 commit comments

Comments
 (0)