diff options
| author | Aleksei Borzenkov <[email protected]> | 2024-01-12 18:19:10 +0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-01-12 16:19:10 +0100 |
| commit | 78e14b4863a7ec8216b3495777fb56a4aa4941bc (patch) | |
| tree | 4a5c530bf0c36594eec3fcffd6bc8ee9df274cbc | |
| parent | 72a5861be06a91dc710b0b141eccbfdec4b2902a (diff) | |
Report correct status on overloaded errors in read table KIKIMR-17778 (#946)
| -rw-r--r-- | ydb/core/grpc_services/rpc_read_table.cpp | 11 | ||||
| -rw-r--r-- | ydb/core/tx/tx_proxy/read_table_impl.cpp | 14 |
2 files changed, 25 insertions, 0 deletions
diff --git a/ydb/core/grpc_services/rpc_read_table.cpp b/ydb/core/grpc_services/rpc_read_table.cpp index baeb439ed61..908ce028e4d 100644 --- a/ydb/core/grpc_services/rpc_read_table.cpp +++ b/ydb/core/grpc_services/rpc_read_table.cpp @@ -7,6 +7,8 @@ #include "local_rate_limiter.h" #include "service_table.h" +#include <ydb/library/yql/core/issue/yql_issue.h> +#include <ydb/library/yql/core/issue/protos/issue_id.pb.h> #include <ydb/library/yql/public/issue/yql_issue_message.h> #include <ydb/library/yql/public/issue/yql_issue.h> #include <ydb/core/base/appdata.h> @@ -246,6 +248,15 @@ private: NYql::IssueToMessage(issue, tmp); return ReplyFinishStream(Ydb::StatusIds::SCHEME_ERROR, issueMessage, ctx); } + case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyShardOverloaded: { + const auto req = TEvReadTableRequest::GetProtoRequest(Request_.get()); + + auto issue = NYql::YqlIssue({}, NYql::TIssuesIds::KIKIMR_OVERLOADED, TStringBuilder() + << "Table " << req->path() << " is overloaded"); + auto tmp = issueMessage.Add(); + NYql::IssueToMessage(issue, tmp); + return ReplyFinishStream(Ydb::StatusIds::OVERLOADED, issueMessage, ctx); + } case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyNotReady: case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyShardTryLater: case TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyShardUnknown: diff --git a/ydb/core/tx/tx_proxy/read_table_impl.cpp b/ydb/core/tx/tx_proxy/read_table_impl.cpp index a30ec40b7f9..f8d9dcb5603 100644 --- a/ydb/core/tx/tx_proxy/read_table_impl.cpp +++ b/ydb/core/tx/tx_proxy/read_table_impl.cpp @@ -12,6 +12,8 @@ #include <ydb/core/scheme/scheme_types_proto.h> #include <ydb/core/engine/mkql_proto.h> +#include <ydb/library/yql/core/issue/yql_issue.h> +#include <ydb/library/yql/core/issue/protos/issue_id.pb.h> #include <ydb/library/yql/public/issue/yql_issue_message.h> #include <ydb/library/yql/public/issue/yql_issue_manager.h> @@ -854,6 +856,16 @@ private: ++TabletsToPrepare; } + void RaiseShardOverloaded(const NKikimrTxDataShard::TEvProposeTransactionResult& record, ui64 shardId) { + auto issue = NYql::YqlIssue({}, NYql::TIssuesIds::KIKIMR_OVERLOADED, TStringBuilder() + << "Shard " << shardId << " is overloaded"); + for (const auto& err : record.GetError()) { + issue.AddSubIssue(new NYql::TIssue(TStringBuilder() + << "[" << err.GetKind() << "] " << err.GetReason())); + } + IssueManager.RaiseIssue(std::move(issue)); + } + void HandlePrepare(TEvDataShard::TEvProposeTransactionResult::TPtr& ev, const TActorContext& ctx) { const auto* msg = ev->Get(); const auto& record = msg->Record; @@ -974,6 +986,7 @@ private: TxProxyMon->TxResultShardOverloaded->Inc(); status = TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyShardOverloaded; code = NKikimrIssues::TStatusIds::OVERLOADED; + RaiseShardOverloaded(record, shardId); break; case NKikimrTxDataShard::TEvProposeTransactionResult::EXEC_ERROR: TxProxyMon->TxResultExecError->Inc(); @@ -1940,6 +1953,7 @@ private: status = TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyShardOverloaded; code = NKikimrIssues::TStatusIds::OVERLOADED; + RaiseShardOverloaded(record, state.ShardId); break; case NKikimrTxDataShard::TEvProposeTransactionResult::EXEC_ERROR: |
