]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/net: move socket ownership from SocketConnection to FrameAssemblerV2
authorYingxin Cheng <yingxin.cheng@intel.com>
Mon, 27 Mar 2023 08:58:16 +0000 (16:58 +0800)
committerMatan Breizman <mbreizma@redhat.com>
Wed, 11 Oct 2023 11:38:30 +0000 (11:38 +0000)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
(cherry picked from commit 53df464f41e6b9c6b97b6a11771bd0de41f2ab8f)

src/crimson/net/FrameAssemblerV2.cc
src/crimson/net/FrameAssemblerV2.h
src/crimson/net/ProtocolV2.cc
src/crimson/net/SocketConnection.cc
src/crimson/net/SocketConnection.h

index 1b6d5a0447cc9121a86af1aeae90e0148ffeb663..e574ba2b2d500562cacbb163705392205b4f7bf8 100644 (file)
@@ -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)] {});
index 06c5cb25eee05fbc77affe2b45ab6e4abe412f67..8f0884ebad700c0c1f4ea6170b7d6940f5fdcfbb 100644 (file)
@@ -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
index 95b756637f4e8a8de6ab2e2d49d3a2c9e65aa2f6..92bb150e800958a89bce96c37ac7442adfe5a5f7 100644 (file)
@@ -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);
index cf7b16f48bd9708e020de26a15747453f788b5cd..88a57c4ab541a73e5ab8c3dcac258ed8065779b4 100644 (file)
@@ -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);
index aa791b6e1701686c26006ae312a822070abe59ca..32624ccccce754ab08d7f2421579ea93b24c8a4a 100644 (file)
@@ -74,7 +74,7 @@ class SocketConnection : public Connection {
 
   std::unique_ptr<ProtocolV2> 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;