From f6b680d922e1ff9537c9208e016630e4eb74a854 Mon Sep 17 00:00:00 2001 From: chenshi5012 <10794822+chenshi5012@users.noreply.github.com> Date: Wed, 14 Oct 2026 09:49:58 +0000 Subject: [PATCH] Fix Session move assignment ownership --- include/nebula/client/Session.h | 14 +++++++++++++- src/client/tests/SessionTest.cpp | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/include/nebula/client/Session.h b/include/nebula/client/Session.h index ad190534..3a868970 100644 --- a/include/nebula/client/Session.h +++ b/include/nebula/client/Session.h @@ -51,15 +51,27 @@ class Session { session.pool_ = nullptr; session.offsetSecs_ = 0; } - void operator=(Session &&session) { + Session &operator=(Session &&session) { + if (this == &session) { + return *this; + } + + release(); sessionId_ = session.sessionId_; + conn_ = std::move(session.conn_); + pool_ = session.pool_; username_ = std::move(session.username_); password_ = std::move(session.password_); timezoneName_ = std::move(session.timezoneName_); offsetSecs_ = session.offsetSecs_; + retryConnect_ = session.retryConnect_; + connectionIsBroken_.store(session.connectionIsBroken_.load()); + session.sessionId_ = -1; session.pool_ = nullptr; session.offsetSecs_ = 0; + session.connectionIsBroken_.store(false); + return *this; } ~Session() { release(); diff --git a/src/client/tests/SessionTest.cpp b/src/client/tests/SessionTest.cpp index 27edb055..5d91c315 100644 --- a/src/client/tests/SessionTest.cpp +++ b/src/client/tests/SessionTest.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "./ClientTest.h" #include "common/graph/Response.h" @@ -101,6 +102,28 @@ TEST_F(SessionTest, Basic) { runOnce(pool); } +TEST_F(SessionTest, MoveAssignmentReturnsConnectionsToOwningPools) { + nebula::Config config; + config.maxConnectionPoolSize_ = 1; + + nebula::ConnectionPool poolA; + nebula::ConnectionPool poolB; + poolA.init({kServerHost ":9669"}, config); + poolB.init({kServerHost ":9669"}, config); + { + auto sessionA = poolA.getSession("root", "nebula"); + auto sessionB = poolB.getSession("root", "nebula"); + ASSERT_TRUE(sessionA.valid()); + ASSERT_TRUE(sessionB.valid()); + + sessionA = std::move(sessionB); + EXPECT_FALSE(sessionB.valid()); + } + + EXPECT_EQ(poolA.size(), 1); + EXPECT_EQ(poolB.size(), 1); +} + TEST_F(SessionTest, OverUse) { nebula::ConnectionPool pool; nebula::Config c;