diff options
author | dcherednik <dcherednik@ydb.tech> | 2023-07-19 22:20:25 +0300 |
---|---|---|
committer | dcherednik <dcherednik@ydb.tech> | 2023-07-19 22:20:25 +0300 |
commit | a557863565c89afa62a4b32caf33985f983bcddb (patch) | |
tree | cd062b1fd9b032b28bc7200edd1121d0e10d58ab | |
parent | a46e5844aa3c4d441691ec0ae69831a40f142060 (diff) | |
download | ydb-a557863565c89afa62a4b32caf33985f983bcddb.tar.gz |
Missed session status check for atach session call. KIKIMR-18250
-rw-r--r-- | ydb/core/grpc_services/query/rpc_attach_session.cpp | 4 | ||||
-rw-r--r-- | ydb/services/ydb/ydb_query_ut.cpp | 24 |
2 files changed, 28 insertions, 0 deletions
diff --git a/ydb/core/grpc_services/query/rpc_attach_session.cpp b/ydb/core/grpc_services/query/rpc_attach_session.cpp index f3bd028a764..2f0f0ad9bde 100644 --- a/ydb/core/grpc_services/query/rpc_attach_session.cpp +++ b/ydb/core/grpc_services/query/rpc_attach_session.cpp @@ -101,6 +101,10 @@ private: return ReplyFinishStream(Ydb::StatusIds::NOT_FOUND); } + if (record.GetResponse().GetSessionStatus() != Ydb::Table::KeepAliveResult::SESSION_STATUS_READY) { + return ReplyFinishStream(Ydb::StatusIds::SESSION_BUSY); + } + SubscribeClientLost(); SendAttachResult(record.GetStatus()); diff --git a/ydb/services/ydb/ydb_query_ut.cpp b/ydb/services/ydb/ydb_query_ut.cpp index fb248d5e9c9..6d5929ab0f1 100644 --- a/ydb/services/ydb/ydb_query_ut.cpp +++ b/ydb/services/ydb/ydb_query_ut.cpp @@ -44,4 +44,28 @@ Y_UNIT_TEST_SUITE(YdbQueryService) { UNIT_ASSERT(allDoneOk); } + + Y_UNIT_TEST(TestAttachTwice) { + TKikimrWithGrpcAndRootSchema server; + + ui16 grpc = server.GetPort(); + TString location = TStringBuilder() << "localhost:" << grpc; + + auto clientConfig = NGRpcProxy::TGRpcClientConfig(location); + bool allDoneOk = true; + + TString sessionId = CreateQuerySession(clientConfig); + + UNIT_ASSERT(sessionId); + + NGrpc::TGRpcClientLow clientLow; + auto p = CheckAttach(clientLow, clientConfig, sessionId, Ydb::StatusIds::SUCCESS, allDoneOk); + + CheckAttach(clientConfig, sessionId, Ydb::StatusIds::SESSION_BUSY, allDoneOk); + + p->Cancel(); + + UNIT_ASSERT(allDoneOk); + } + } |