diff options
author | hor911 <hor911@ydb.tech> | 2023-10-17 15:57:34 +0300 |
---|---|---|
committer | hor911 <hor911@ydb.tech> | 2023-10-17 16:41:58 +0300 |
commit | 75a44bce0d6f80863c71b1f16a97f85daf56bb93 (patch) | |
tree | 3134ed0e6e3e507dd82d1f3d7e787fb27b9b2525 | |
parent | 8597717cabc3494c940fc04b1e3ff1a8ab92b151 (diff) | |
download | ydb-75a44bce0d6f80863c71b1f16a97f85daf56bb93.tar.gz |
Add EXTERNAL_ERROR to YdbStatusCode
В связи с появлением функциональности федеративных запросов, которые обращаются ко внешним источникам данных, требуется новый статус EXTERNAL_ERROR
Его семантика: --неведомая хрень-- неизвестная системе ошибка во внешнем источнике данных, non-retriable
Его следует возвращать, когда внешний источник (положим S3) вернул какую-то ошибку, а система не смогла ее обработать. Далеко не все ошибки следует транслировать в этот статус, все знакомые и понятные ошибки надо обрабатывать (ретраить) на месте или возвращать какой-то другой понятный статус. Например, если в источнике отсутствует какой-то столбец, он используется в запросе и это можно понять только в runtime (при запуске запроса), то подходящим статусом может быть BAD_REQUEST.
EXTERNAL_ERROR - это именно про ту ошибку, которую система не смогла понять. Аналог INTERNAL_ERROR, но применительно ко внешней системе. По возможности следует докинуть подробностей через Issues,
От пользователя требуется почитать Issues и попытаться понять, что с этим можно сделать, потому что автоматически ошибка может не исправиться. Например, может иметь смысл повторить запрос, но только в ручном режиме, автоматические ретраи тут не планируются.
-rw-r--r-- | ydb/library/yql/dq/actors/dq.cpp | 6 | ||||
-rw-r--r-- | ydb/public/api/protos/ydb_status_codes.proto | 1 | ||||
-rw-r--r-- | ydb/public/sdk/cpp/client/ydb_persqueue_core/impl/common.cpp | 1 | ||||
-rw-r--r-- | ydb/public/sdk/cpp/client/ydb_types/status_codes.h | 1 | ||||
-rw-r--r-- | ydb/public/sdk/python2/ydb/issues.py | 6 | ||||
-rw-r--r-- | ydb/public/sdk/python3/ydb/issues.py | 6 |
6 files changed, 21 insertions, 0 deletions
diff --git a/ydb/library/yql/dq/actors/dq.cpp b/ydb/library/yql/dq/actors/dq.cpp index 1680d9c244f..bda08348dd4 100644 --- a/ydb/library/yql/dq/actors/dq.cpp +++ b/ydb/library/yql/dq/actors/dq.cpp @@ -24,6 +24,10 @@ Ydb::StatusIds::StatusCode DqStatusToYdbStatus(NYql::NDqProto::StatusIds::Status return Ydb::StatusIds::CANCELLED; case NYql::NDqProto::StatusIds::OVERLOADED: return Ydb::StatusIds::OVERLOADED; + case NYql::NDqProto::StatusIds::LIMIT_EXCEEDED: + return Ydb::StatusIds::PRECONDITION_FAILED; + case NYql::NDqProto::StatusIds::EXTERNAL_ERROR: + return Ydb::StatusIds::EXTERNAL_ERROR; case NYql::NDqProto::StatusIds::SCHEME_ERROR: return Ydb::StatusIds::SCHEME_ERROR; case NYql::NDqProto::StatusIds::GENERIC_ERROR: @@ -61,6 +65,8 @@ NYql::NDqProto::StatusIds::StatusCode YdbStatusToDqStatus(Ydb::StatusIds::Status return NYql::NDqProto::StatusIds::SCHEME_ERROR; case Ydb::StatusIds::GENERIC_ERROR: return NYql::NDqProto::StatusIds::GENERIC_ERROR; + case Ydb::StatusIds::EXTERNAL_ERROR: + return NYql::NDqProto::StatusIds::EXTERNAL_ERROR; default: return NYql::NDqProto::StatusIds::UNSPECIFIED; } diff --git a/ydb/public/api/protos/ydb_status_codes.proto b/ydb/public/api/protos/ydb_status_codes.proto index 4c500dc43ac..2ff304c8f5c 100644 --- a/ydb/public/api/protos/ydb_status_codes.proto +++ b/ydb/public/api/protos/ydb_status_codes.proto @@ -27,6 +27,7 @@ message StatusIds { UNDETERMINED = 400170; UNSUPPORTED = 400180; SESSION_BUSY = 400190; + EXTERNAL_ERROR = 400200; } // reserved range [401000, 402999] for internal client status } diff --git a/ydb/public/sdk/cpp/client/ydb_persqueue_core/impl/common.cpp b/ydb/public/sdk/cpp/client/ydb_persqueue_core/impl/common.cpp index b5ab7512902..9aeedeffeef 100644 --- a/ydb/public/sdk/cpp/client/ydb_persqueue_core/impl/common.cpp +++ b/ydb/public/sdk/cpp/client/ydb_persqueue_core/impl/common.cpp @@ -38,6 +38,7 @@ ERetryErrorClass GetRetryErrorClass(EStatus status) { case EStatus::UNSUPPORTED: case EStatus::ALREADY_EXISTS: case EStatus::NOT_FOUND: + case EStatus::EXTERNAL_ERROR: case EStatus::CLIENT_UNAUTHENTICATED: case EStatus::CLIENT_CALL_UNIMPLEMENTED: return ERetryErrorClass::NoRetry; diff --git a/ydb/public/sdk/cpp/client/ydb_types/status_codes.h b/ydb/public/sdk/cpp/client/ydb_types/status_codes.h index 9bc239c0579..906a2bf00b0 100644 --- a/ydb/public/sdk/cpp/client/ydb_types/status_codes.h +++ b/ydb/public/sdk/cpp/client/ydb_types/status_codes.h @@ -30,6 +30,7 @@ enum class EStatus : size_t { UNDETERMINED = 400170, UNSUPPORTED = 400180, SESSION_BUSY = 400190, + EXTERNAL_ERROR = 400200, // Client statuses // Cannot connect or unrecoverable network error. (map from gRPC UNAVAILABLE) diff --git a/ydb/public/sdk/python2/ydb/issues.py b/ydb/public/sdk/python2/ydb/issues.py index 727aff1bf7c..fd301e32b6f 100644 --- a/ydb/public/sdk/python2/ydb/issues.py +++ b/ydb/public/sdk/python2/ydb/issues.py @@ -32,6 +32,7 @@ class StatusCode(enum.IntEnum): UNDETERMINED = _apis.StatusIds.UNDETERMINED UNSUPPORTED = _apis.StatusIds.UNSUPPORTED SESSION_BUSY = _apis.StatusIds.SESSION_BUSY + EXTERNAL_ERROR = _apis.StatusIds.EXTERNAL_ERROR CONNECTION_LOST = _TRANSPORT_STATUSES_FIRST + 10 CONNECTION_FAILURE = _TRANSPORT_STATUSES_FIRST + 20 @@ -148,6 +149,10 @@ class SessionBusy(Error): status = StatusCode.SESSION_BUSY +class ExternalError(Error): + status = StatusCode.EXTERNAL_ERROR + + class SessionPoolEmpty(Error, queue.Empty): status = StatusCode.SESSION_POOL_EMPTY @@ -180,6 +185,7 @@ _server_side_error_map = { StatusCode.UNDETERMINED: Undetermined, StatusCode.UNSUPPORTED: Unsupported, StatusCode.SESSION_BUSY: SessionBusy, + StatusCode.EXTERNAL_ERROR: ExternalError, } diff --git a/ydb/public/sdk/python3/ydb/issues.py b/ydb/public/sdk/python3/ydb/issues.py index a489d4e0662..66dba508433 100644 --- a/ydb/public/sdk/python3/ydb/issues.py +++ b/ydb/public/sdk/python3/ydb/issues.py @@ -32,6 +32,7 @@ class StatusCode(enum.IntEnum): UNDETERMINED = _apis.StatusIds.UNDETERMINED UNSUPPORTED = _apis.StatusIds.UNSUPPORTED SESSION_BUSY = _apis.StatusIds.SESSION_BUSY + EXTERNAL_ERROR = _apis.StatusIds.EXTERNAL_ERROR CONNECTION_LOST = _TRANSPORT_STATUSES_FIRST + 10 CONNECTION_FAILURE = _TRANSPORT_STATUSES_FIRST + 20 @@ -152,6 +153,10 @@ class SessionBusy(Error): status = StatusCode.SESSION_BUSY +class ExternalError(Error): + status = StatusCode.EXTERNAL_ERROR + + class SessionPoolEmpty(Error, queue.Empty): status = StatusCode.SESSION_POOL_EMPTY @@ -193,6 +198,7 @@ _server_side_error_map = { StatusCode.UNDETERMINED: Undetermined, StatusCode.UNSUPPORTED: Unsupported, StatusCode.SESSION_BUSY: SessionBusy, + StatusCode.EXTERNAL_ERROR: ExternalError, } |