Skip to content

Commit 07386ff

Browse files
committed
Add option for gzip
1 parent ee3dd04 commit 07386ff

8 files changed

Lines changed: 61 additions & 2 deletions

File tree

temporalio/bridge/client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class ClientConfig:
8181
client_version: str
8282
http_connect_proxy_config: ClientHttpConnectProxyConfig | None
8383
dns_load_balancing_config: ClientDnsLoadBalancingConfig | None
84+
grpc_compression: str
8485

8586

8687
@dataclass

temporalio/bridge/src/client.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use temporalio_client::tonic::{
99
};
1010
use temporalio_client::{
1111
ClientKeepAliveOptions as CoreClientKeepAliveConfig, Connection, ConnectionOptions,
12-
DnsLoadBalancingOptions, HttpConnectProxyOptions, RetryOptions,
12+
DnsLoadBalancingOptions, GrpcCompression, HttpConnectProxyOptions, RetryOptions,
1313
};
1414
use tracing::warn;
1515
use url::Url;
@@ -37,6 +37,7 @@ pub struct ClientConfig {
3737
keep_alive_config: Option<ClientKeepAliveConfig>,
3838
http_connect_proxy_config: Option<ClientHttpConnectProxyConfig>,
3939
dns_load_balancing_config: Option<ClientDnsLoadBalancingConfig>,
40+
grpc_compression: String,
4041
}
4142

4243
#[derive(FromPyObject)]
@@ -266,6 +267,7 @@ impl ClientConfig {
266267
.keep_alive(self.keep_alive_config.map(Into::into))
267268
.maybe_http_connect_proxy(self.http_connect_proxy_config.map(Into::into))
268269
.dns_load_balancing(dns_load_balancing)
270+
.grpc_compression(grpc_compression_from_str(&self.grpc_compression)?)
269271
.headers(ascii_headers)
270272
.binary_headers(binary_headers)
271273
.maybe_api_key(self.api_key)
@@ -279,6 +281,16 @@ impl ClientConfig {
279281
}
280282
}
281283

284+
fn grpc_compression_from_str(value: &str) -> PyResult<GrpcCompression> {
285+
match value {
286+
"none" => Ok(GrpcCompression::None),
287+
"gzip" => Ok(GrpcCompression::Gzip),
288+
_ => Err(PyValueError::new_err(format!(
289+
"invalid grpc_compression: {value}"
290+
))),
291+
}
292+
}
293+
282294
impl TryFrom<ClientTlsConfig> for temporalio_client::TlsOptions {
283295
type Error = PyErr;
284296

temporalio/client/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from temporalio.service import (
1717
ConnectConfig,
1818
DnsLoadBalancingConfig,
19+
GrpcCompression,
1920
HttpConnectProxyConfig,
2021
KeepAliveConfig,
2122
RetryConfig,
@@ -355,6 +356,7 @@
355356
"WorkflowSerializationContext",
356357
"ConnectConfig",
357358
"DnsLoadBalancingConfig",
359+
"GrpcCompression",
358360
"HttpConnectProxyConfig",
359361
"KeepAliveConfig",
360362
"RetryConfig",

temporalio/client/_client.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from temporalio.service import (
3333
ConnectConfig,
3434
DnsLoadBalancingConfig,
35+
GrpcCompression,
3536
HttpConnectProxyConfig,
3637
KeepAliveConfig,
3738
RetryConfig,
@@ -152,6 +153,7 @@ async def connect(
152153
runtime: temporalio.runtime.Runtime | None = None,
153154
http_connect_proxy_config: HttpConnectProxyConfig | None = None,
154155
dns_load_balancing_config: DnsLoadBalancingConfig | None = None,
156+
grpc_compression: GrpcCompression = GrpcCompression.GZIP,
155157
header_codec_behavior: HeaderCodecBehavior = HeaderCodecBehavior.NO_CODEC,
156158
) -> Self:
157159
"""Connect to a Temporal server.
@@ -212,6 +214,9 @@ async def connect(
212214
be set to ``None`` to disable. Silently disabled when
213215
``http_connect_proxy_config`` is set, since the two are mutually
214216
exclusive.
217+
grpc_compression: Transport-level gRPC compression for the client
218+
connection. Default is gzip. Set to
219+
:py:attr:`GrpcCompression.NONE` to disable compression.
215220
header_codec_behavior: Encoding behavior for headers sent by the client.
216221
"""
217222
connect_config = temporalio.service.ConnectConfig(
@@ -226,6 +231,7 @@ async def connect(
226231
runtime=runtime,
227232
http_connect_proxy_config=http_connect_proxy_config,
228233
dns_load_balancing_config=dns_load_balancing_config,
234+
grpc_compression=grpc_compression,
229235
)
230236

231237
def make_lambda(
@@ -3042,6 +3048,7 @@ class ClientConnectConfig(TypedDict, total=False):
30423048
runtime: temporalio.runtime.Runtime | None
30433049
http_connect_proxy_config: HttpConnectProxyConfig | None
30443050
dns_load_balancing_config: DnsLoadBalancingConfig | None
3051+
grpc_compression: GrpcCompression
30453052
header_codec_behavior: HeaderCodecBehavior
30463053

30473054

temporalio/client/_cloud.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import temporalio.service
1111
from temporalio.service import (
1212
DnsLoadBalancingConfig,
13+
GrpcCompression,
1314
HttpConnectProxyConfig,
1415
KeepAliveConfig,
1516
RetryConfig,
@@ -51,6 +52,7 @@ async def connect(
5152
runtime: temporalio.runtime.Runtime | None = None,
5253
http_connect_proxy_config: HttpConnectProxyConfig | None = None,
5354
dns_load_balancing_config: DnsLoadBalancingConfig | None = None,
55+
grpc_compression: GrpcCompression = GrpcCompression.GZIP,
5456
) -> CloudOperationsClient:
5557
"""Connect to a Temporal Cloud Operations API.
5658
@@ -91,6 +93,9 @@ async def connect(
9193
client connection. Default is disabled. Silently disabled when
9294
``http_connect_proxy_config`` is set, since the two are mutually
9395
exclusive.
96+
grpc_compression: Transport-level gRPC compression for the client
97+
connection. Default is gzip. Set to
98+
:py:attr:`GrpcCompression.NONE` to disable compression.
9499
"""
95100
# Add version if given
96101
if version:
@@ -108,6 +113,7 @@ async def connect(
108113
runtime=runtime,
109114
http_connect_proxy_config=http_connect_proxy_config,
110115
dns_load_balancing_config=dns_load_balancing_config,
116+
grpc_compression=grpc_compression,
111117
)
112118
return CloudOperationsClient(
113119
await temporalio.service.ServiceClient.connect(connect_config)

temporalio/service.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from collections.abc import Mapping
1212
from dataclasses import dataclass, field
1313
from datetime import timedelta
14-
from enum import IntEnum
14+
from enum import Enum, IntEnum
1515
from typing import ClassVar, TypeVar
1616

1717
import google.protobuf.message
@@ -158,6 +158,16 @@ def _to_bridge_config(
158158
DnsLoadBalancingConfig.default = DnsLoadBalancingConfig()
159159

160160

161+
class GrpcCompression(Enum):
162+
"""Transport-level gRPC compression mode."""
163+
164+
NONE = "none"
165+
"""Do not compress gRPC requests or advertise support for compressed responses."""
166+
167+
GZIP = "gzip"
168+
"""Gzip-compress gRPC requests and accept gzip-compressed responses."""
169+
170+
161171
@dataclass
162172
class ConnectConfig:
163173
"""Config for connecting to the server."""
@@ -173,6 +183,7 @@ class ConnectConfig:
173183
runtime: temporalio.runtime.Runtime | None = None
174184
http_connect_proxy_config: HttpConnectProxyConfig | None = None
175185
dns_load_balancing_config: DnsLoadBalancingConfig | None = None
186+
grpc_compression: GrpcCompression = GrpcCompression.GZIP
176187

177188
def __post_init__(self) -> None:
178189
"""Set extra defaults on unset properties."""
@@ -235,6 +246,7 @@ def _to_bridge_config(self) -> temporalio.bridge.client.ClientConfig:
235246
if self.dns_load_balancing_config
236247
else None
237248
),
249+
grpc_compression=self.grpc_compression.value,
238250
)
239251

240252

tests/test_client_exports.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"FetchWorkflowHistoryEventsInput",
5252
"GetWorkerBuildIdCompatibilityInput",
5353
"GetWorkerTaskReachabilityInput",
54+
"GrpcCompression",
5455
"HeaderCodecBehavior",
5556
"HeartbeatAsyncActivityInput",
5657
"HttpConnectProxyConfig",

tests/test_service.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,24 @@ def test_connect_config_dns_load_balancing_disabled():
242242
assert bridge_config.dns_load_balancing_config is None
243243

244244

245+
def test_connect_config_grpc_compression_default():
246+
"""gRPC compression defaults to gzip and is forwarded to the bridge."""
247+
config = temporalio.service.ConnectConfig(target_host="localhost:7233")
248+
bridge_config = config._to_bridge_config()
249+
assert config.grpc_compression == temporalio.service.GrpcCompression.GZIP
250+
assert bridge_config.grpc_compression == "gzip"
251+
252+
253+
def test_connect_config_grpc_compression_none():
254+
"""gRPC compression can be disabled and is forwarded to the bridge."""
255+
config = temporalio.service.ConnectConfig(
256+
target_host="localhost:7233",
257+
grpc_compression=temporalio.service.GrpcCompression.NONE,
258+
)
259+
bridge_config = config._to_bridge_config()
260+
assert bridge_config.grpc_compression == "none"
261+
262+
245263
async def test_rpc_execution_not_unknown(client: Client):
246264
"""
247265
Execute each rpc method and expect a failure, but ensure the failure is not that the rpc method is unknown

0 commit comments

Comments
 (0)