aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhor911 <hor911@ydb.tech>2023-10-17 15:57:34 +0300
committerhor911 <hor911@ydb.tech>2023-10-17 16:41:58 +0300
commit75a44bce0d6f80863c71b1f16a97f85daf56bb93 (patch)
tree3134ed0e6e3e507dd82d1f3d7e787fb27b9b2525
parent8597717cabc3494c940fc04b1e3ff1a8ab92b151 (diff)
downloadydb-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.cpp6
-rw-r--r--ydb/public/api/protos/ydb_status_codes.proto1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_persqueue_core/impl/common.cpp1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_types/status_codes.h1
-rw-r--r--ydb/public/sdk/python2/ydb/issues.py6
-rw-r--r--ydb/public/sdk/python3/ydb/issues.py6
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,
}