diff --git a/include/nebula/client/Session.h b/include/nebula/client/Session.h index ad19053..3a86897 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 27edb05..5d91c31 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;