Expose TCP connection timeout in Python client (#1963) · temporalio/sdk-python@6c75281 · GitHub
Skip to content

Commit 6c75281

Browse files
authored
Expose TCP connection timeout in Python client (#1963)
1 parent 49650b4 commit 6c75281

6 files changed

Lines changed: 74 additions & 0 deletions

File tree

‎changelog/added/patient-puffin.md‎

Lines changed: 1 addition & 0 deletions

‎temporalio/bridge/client.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ class ClientConfig:
8585
grpc_compression: str
8686
payloads_warn_size: int
8787
memo_warn_size: int
88+
connect_timeout_millis: int | None = None
8889

8990

9091
@dataclass

‎temporalio/bridge/src/client.rs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ pub struct ClientConfig {
4444
tls_config: Option<ClientTlsConfig>,
4545
retry_config: Option<ClientRetryConfig>,
4646
keep_alive_config: Option<ClientKeepAliveConfig>,
47+
connect_timeout_millis: Option<u64>,
4748
http_connect_proxy_config: Option<ClientHttpConnectProxyConfig>,
4849
dns_load_balancing_config: Option<ClientDnsLoadBalancingConfig>,
4950
grpc_compression: String,
@@ -277,6 +278,7 @@ impl ClientConfig {
277278
.map_or(RetryOptions::default(), |c| c.into()),
278279
)
279280
.keep_alive(self.keep_alive_config.map(Into::into))
281+
.maybe_connect_timeout(self.connect_timeout_millis.map(Duration::from_millis))
280282
.maybe_http_connect_proxy(self.http_connect_proxy_config.map(Into::into))
281283
.dns_load_balancing(dns_load_balancing)
282284
.grpc_compression(grpc_compression_from_str(&self.grpc_compression)?)

‎temporalio/client/_client.py‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ async def connect(
146146
tls: bool | TLSConfig | None = None,
147147
retry_config: RetryConfig | None = None,
148148
keep_alive_config: KeepAliveConfig | None = KeepAliveConfig.default,
149+
connect_timeout: timedelta | None = None,
149150
rpc_metadata: Mapping[str, str | bytes] = {},
150151
identity: str | None = None,
151152
lazy: bool = False,
@@ -200,6 +201,10 @@ async def connect(
200201
connection. Default is to check every 30s and kill the
201202
connection if a response doesn't come back in 15s. Can be set to
202203
``None`` to disable.
204+
connect_timeout: Maximum duration of a TCP connection attempt.
205+
If unset, no explicit connection timeout is applied. This is
206+
separate from RPC timeouts and does not bound the total duration
207+
of a call with retries.
203208
rpc_metadata: Headers to use for all calls to the server. Keys here
204209
can be overriden by per-call RPC metadata keys.
205210
identity: Identity for this client. If unset, a default is created
@@ -227,6 +232,7 @@ async def connect(
227232
tls=tls,
228233
retry_config=retry_config,
229234
keep_alive_config=keep_alive_config,
235+
connect_timeout=connect_timeout,
230236
rpc_metadata=rpc_metadata,
231237
identity=identity or "",
232238
lazy=lazy,
@@ -3013,6 +3019,7 @@ class ClientConnectConfig(TypedDict, total=False):
30133019
tls: bool | TLSConfig | None
30143020
retry_config: RetryConfig | None
30153021
keep_alive_config: KeepAliveConfig | None
3022+
connect_timeout: timedelta | None
30163023
rpc_metadata: Mapping[str, str | bytes]
30173024
identity: str | None
30183025
lazy: bool

‎temporalio/service.py‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ class ConnectConfig:
239239
dns_load_balancing_config: DnsLoadBalancingConfig | None = None
240240
grpc_compression: GrpcCompression = GrpcCompression.GZIP
241241
payload_limits: PayloadLimitsConfig = field(default_factory=PayloadLimitsConfig)
242+
connect_timeout: timedelta | None = None
242243

243244
def __post_init__(self) -> None:
244245
"""Set extra defaults on unset properties."""
@@ -287,6 +288,11 @@ def _to_bridge_config(self) -> temporalio.bridge.client.ClientConfig:
287288
if self.keep_alive_config
288289
else None
289290
),
291+
connect_timeout_millis=(
292+
int(self.connect_timeout.total_seconds() * 1000)
293+
if self.connect_timeout is not None
294+
else None
295+
),
290296
metadata=self.rpc_metadata,
291297
identity=self.identity,
292298
client_name="temporal-python",

‎tests/test_service.py‎

Lines changed: 57 additions & 0 deletions

0 commit comments

Comments
 (0)