]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/.../osd_operation.h: add RemoteOperation
authorSamuel Just <sjust@redhat.com>
Fri, 4 Apr 2025 01:34:50 +0000 (01:34 +0000)
committerSamuel Just <sjust@redhat.com>
Mon, 28 Apr 2025 21:19:27 +0000 (21:19 +0000)
Subsequent commits will switch various ops to inherit from
this thereby removing some boilerplate.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/osd/osd_operation.h

index 7f6d32c20140c5875aaac095a2dd06ae02b57cb2..33f3b10ee9b0a3af79dcddcf39f4de8bc76b1c3a 100644 (file)
@@ -4,6 +4,7 @@
 #pragma once
 
 #include "crimson/common/operation.h"
+#include "crimson/net/Connection.h"
 #include "crimson/osd/pg_interval_interrupt_condition.h"
 #include "crimson/osd/scheduler/scheduler.h"
 #include "osd/osd_types.h"
@@ -165,6 +166,61 @@ private:
   virtual void dump_detail(ceph::Formatter *f) const = 0;
 };
 
+class RemoteOperation {
+  crimson::net::ConnectionRef l_conn;
+  crimson::net::ConnectionXcoreRef r_conn;
+
+public:
+  RemoteOperation(crimson::net::ConnectionRef &&conn)
+    : l_conn(std::move(conn)) {}
+
+  crimson::net::Connection &get_local_connection() {
+    assert(l_conn);
+    assert(!r_conn);
+    return *l_conn;
+  };
+
+  crimson::net::Connection &get_foreign_connection() {
+    assert(r_conn);
+    assert(!l_conn);
+    return *r_conn;
+  };
+
+  crimson::net::ConnectionFFRef prepare_remote_submission() {
+    assert(l_conn);
+    assert(!r_conn);
+    auto ret = seastar::make_foreign(std::move(l_conn));
+    l_conn.reset();
+    return ret;
+  }
+
+  void finish_remote_submission(crimson::net::ConnectionFFRef conn) {
+    assert(conn);
+    assert(!l_conn);
+    assert(!r_conn);
+    r_conn = make_local_shared_foreign(std::move(conn));
+  }
+
+  crimson::net::Connection &get_connection() const {
+    if (l_conn) {
+      return *l_conn;
+    } else {
+      assert(r_conn);
+      return *r_conn;
+    }
+  }
+
+  /**
+   * get_remote_connection
+   *
+   * Return a reference to the remote connection to allow caller to
+   * perform a copy only as needed.
+   */
+  crimson::net::ConnectionXcoreRef &get_remote_connection() {
+    return r_conn;
+  }
+};
+
 template <class T>
 class TrackableOperationT : public OperationT<T> {
   T* that() {