Skip to content

Commit b9d70ea

Browse files
authored
Merge pull request #791 from ydb-platform/fix_message_larger_than_limit
Make "Sent message larger than max" error non retryable
2 parents c25e67e + e676901 commit b9d70ea

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

tests/test_errors.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,36 @@
1+
import unittest.mock
2+
3+
import grpc
14
import ydb
25
import pytest
36

47
from os import path
8+
from ydb.connection import _rpc_error_handler
9+
10+
11+
def _make_rpc_error(code, details):
12+
error = unittest.mock.MagicMock(spec=grpc.Call)
13+
error.code.return_value = code
14+
error.details.return_value = details
15+
return error
16+
17+
18+
def test_resource_exhausted_large_message_returns_bad_request():
19+
rpc_error = _make_rpc_error(
20+
grpc.StatusCode.RESOURCE_EXHAUSTED,
21+
"CLIENT: Sent message larger than max (101289032 vs. 64000000)",
22+
)
23+
result = _rpc_error_handler("test_rpc", rpc_error)
24+
assert isinstance(result, ydb.issues.BadRequest)
25+
26+
27+
def test_resource_exhausted_other_reason_returns_connection_lost():
28+
rpc_error = _make_rpc_error(
29+
grpc.StatusCode.RESOURCE_EXHAUSTED,
30+
"Quota exceeded",
31+
)
32+
result = _rpc_error_handler("test_rpc", rpc_error)
33+
assert isinstance(result, ydb.issues.ConnectionLost)
534

635

736
def test_scheme_error(driver_sync, database):

ydb/connection.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ def _rpc_error_handler(
9898
return issues.Unimplemented("Method or feature is not implemented on server!")
9999
elif rpc_error.code() == grpc.StatusCode.CANCELLED:
100100
return issues.Cancelled(rpc_error.details())
101+
elif rpc_error.code() == grpc.StatusCode.RESOURCE_EXHAUSTED:
102+
if "Sent message larger than max" in rpc_error.details():
103+
return issues.BadRequest(rpc_error.details())
101104
elif use_unavailable and rpc_error.code() == grpc.StatusCode.UNAVAILABLE:
102105
return issues.Unavailable(rpc_error.details())
103106

0 commit comments

Comments
 (0)