From: Yingxin Cheng Date: Mon, 27 Mar 2023 08:58:16 +0000 (+0800) Subject: crimson/net: move socket ownership from SocketConnection to FrameAssemblerV2 X-Git-Tag: v18.2.1~166^2~30 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=ba0a3965778034dbabf32659a76450449c8d2d87;p=ceph-ci.git crimson/net: move socket ownership from SocketConnection to FrameAssemblerV2 Signed-off-by: Yingxin Cheng (cherry picked from commit 53df464f41e6b9c6b97b6a11771bd0de41f2ab8f) --- diff --git a/src/crimson/net/FrameAssemblerV2.cc b/src/crimson/net/FrameAssemblerV2.cc index 1b6d5a0447c..e574ba2b2d5 100644 --- a/src/crimson/net/FrameAssemblerV2.cc +++ b/src/crimson/net/FrameAssemblerV2.cc @@ -30,6 +30,13 @@ FrameAssemblerV2::FrameAssemblerV2(SocketConnection &_conn) : conn{_conn} {} +FrameAssemblerV2::~FrameAssemblerV2() +{ + if (has_socket()) { + std::ignore = move_socket(); + } +} + #ifdef UNIT_TESTS_BUILT // should be consistent to intercept() in ProtocolV2.cc void FrameAssemblerV2::intercept_frame(Tag tag, bool is_write) @@ -69,9 +76,8 @@ FrameAssemblerV2::mover_t FrameAssemblerV2::to_replace() { assert(is_socket_valid()); - socket = nullptr; return mover_t{ - std::move(conn.socket), + move_socket(), std::move(session_stream_handlers), std::move(session_comp_handlers)}; } @@ -117,11 +123,18 @@ bool FrameAssemblerV2::is_socket_valid() const return has_socket() && !socket->is_shutdown(); } +SocketRef FrameAssemblerV2::move_socket() +{ + assert(has_socket()); + conn.set_socket(nullptr); + return std::move(socket); +} + void FrameAssemblerV2::set_socket(SocketRef &&new_socket) { assert(!has_socket()); - socket = new_socket.get(); - conn.socket = std::move(new_socket); + socket = std::move(new_socket); + conn.set_socket(socket.get()); assert(is_socket_valid()); } @@ -141,8 +154,7 @@ seastar::future<> FrameAssemblerV2::replace_shutdown_socket(SocketRef &&new_sock { assert(has_socket()); assert(socket->is_shutdown()); - socket = nullptr; - auto old_socket = std::move(conn.socket); + auto old_socket = move_socket(); set_socket(std::move(new_socket)); return old_socket->close( ).then([sock = std::move(old_socket)] {}); diff --git a/src/crimson/net/FrameAssemblerV2.h b/src/crimson/net/FrameAssemblerV2.h index 06c5cb25eee..8f0884ebad7 100644 --- a/src/crimson/net/FrameAssemblerV2.h +++ b/src/crimson/net/FrameAssemblerV2.h @@ -19,7 +19,7 @@ class FrameAssemblerV2 { public: FrameAssemblerV2(SocketConnection &conn); - ~FrameAssemblerV2() = default; + ~FrameAssemblerV2(); FrameAssemblerV2(const FrameAssemblerV2 &) = delete; @@ -127,6 +127,8 @@ public: private: bool has_socket() const; + SocketRef move_socket(); + void log_main_preamble(const ceph::bufferlist &bl); #ifdef UNIT_TESTS_BUILT @@ -135,7 +137,7 @@ private: SocketConnection &conn; - Socket *socket = nullptr; + SocketRef socket; /* * auth signature diff --git a/src/crimson/net/ProtocolV2.cc b/src/crimson/net/ProtocolV2.cc index 95b756637f4..92bb150e800 100644 --- a/src/crimson/net/ProtocolV2.cc +++ b/src/crimson/net/ProtocolV2.cc @@ -109,7 +109,7 @@ void intercept(Breakpoint bp, bp_type_t type, SocketConnection& conn, Interceptor *interceptor, - SocketRef& socket) { + Socket *socket) { if (interceptor) { auto action = interceptor->intercept(conn, Breakpoint(bp)); socket->set_trap(type, action, &interceptor->blocker); diff --git a/src/crimson/net/SocketConnection.cc b/src/crimson/net/SocketConnection.cc index cf7b16f48bd..88a57c4ab54 100644 --- a/src/crimson/net/SocketConnection.cc +++ b/src/crimson/net/SocketConnection.cc @@ -146,6 +146,10 @@ SocketConnection::get_local_shared_foreign_from_this() seastar::make_foreign(shared_from_this())); } +void SocketConnection::set_socket(Socket *s) { + socket = s; +} + void SocketConnection::print(ostream& out) const { out << (void*)this << " "; messenger.print(out); diff --git a/src/crimson/net/SocketConnection.h b/src/crimson/net/SocketConnection.h index aa791b6e170..32624ccccce 100644 --- a/src/crimson/net/SocketConnection.h +++ b/src/crimson/net/SocketConnection.h @@ -74,7 +74,7 @@ class SocketConnection : public Connection { std::unique_ptr protocol; - SocketRef socket; + Socket *socket = nullptr; entity_name_t peer_name = {0, entity_name_t::NEW}; @@ -205,6 +205,8 @@ private: features = f; } + void set_socket(Socket *s); + #ifdef UNIT_TESTS_BUILT bool is_closed_clean() const override;