Skip to content

Commit 48ac008

Browse files
zeevdrclaude
andauthored
fix(_retry): add RESOURCE_EXHAUSTED to default retryable codes (#96)
Rate-limited reads are rejected (not applied) so retrying is safe. Adds RESOURCE_EXHAUSTED alongside UNAVAILABLE and DEADLINE_EXCEEDED in the default retryable_codes tuple. Updates test_retry_config_defaults and adds test_retry_on_resource_exhausted. Closes #59 Co-authored-by: Claude <noreply@anthropic.com>
1 parent b2cdf36 commit 48ac008

2 files changed

Lines changed: 13 additions & 0 deletions

File tree

sdk/src/opendecree/_retry.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class RetryConfig:
4242
default=(
4343
grpc.StatusCode.UNAVAILABLE,
4444
grpc.StatusCode.DEADLINE_EXCEEDED,
45+
grpc.StatusCode.RESOURCE_EXHAUSTED,
4546
)
4647
)
4748
total_timeout: float | None = None

sdk/tests/test_retry.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,18 @@ def test_retry_config_defaults():
6464
assert cfg.multiplier == 2.0
6565
assert grpc.StatusCode.UNAVAILABLE in cfg.retryable_codes
6666
assert grpc.StatusCode.DEADLINE_EXCEEDED in cfg.retryable_codes
67+
assert grpc.StatusCode.RESOURCE_EXHAUSTED in cfg.retryable_codes
68+
69+
70+
def test_retry_on_resource_exhausted():
71+
err = FakeRpcError(grpc.StatusCode.RESOURCE_EXHAUSTED)
72+
fn = MagicMock(side_effect=[err, "ok"])
73+
74+
with patch("opendecree._retry.time.sleep"):
75+
result = with_retry(RetryConfig(max_attempts=3), fn)
76+
77+
assert result == "ok"
78+
assert fn.call_count == 2
6779

6880

6981
def test_write_safe_config_strips_deadline_exceeded():

0 commit comments

Comments
 (0)