aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordcherednik <dcherednik@ydb.tech>2023-07-19 22:20:25 +0300
committerdcherednik <dcherednik@ydb.tech>2023-07-19 22:20:25 +0300
commita557863565c89afa62a4b32caf33985f983bcddb (patch)
treecd062b1fd9b032b28bc7200edd1121d0e10d58ab
parenta46e5844aa3c4d441691ec0ae69831a40f142060 (diff)
downloadydb-a557863565c89afa62a4b32caf33985f983bcddb.tar.gz
Missed session status check for atach session call. KIKIMR-18250
-rw-r--r--ydb/core/grpc_services/query/rpc_attach_session.cpp4
-rw-r--r--ydb/services/ydb/ydb_query_ut.cpp24
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);
+ }
+
}