diff --git a/ydb/core/grpc_services/rpc_read_table.cpp b/ydb/core/grpc_services/rpc_read_table.cpp index baeb439ed614..908ce028e4df 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 +#include #include #include #include @@ -246,6 +248,15 @@ class TReadTableRPC : public TActorBootstrapped { 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 a30ec40b7f9a..f8d9dcb56038 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 #include +#include +#include #include #include @@ -854,6 +856,16 @@ class TReadTableWorker : public TActorBootstrapped { ++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 @@ class TReadTableWorker : public TActorBootstrapped { 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 @@ class TReadTableWorker : public TActorBootstrapped { status = TEvTxUserProxy::TEvProposeTransactionStatus::EStatus::ProxyShardOverloaded; code = NKikimrIssues::TStatusIds::OVERLOADED; + RaiseShardOverloaded(record, state.ShardId); break; case NKikimrTxDataShard::TEvProposeTransactionResult::EXEC_ERROR: