From 6da6b0f83cbe18520566ca91fef609de23b399a5 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 4 Apr 2025 01:34:50 +0000 Subject: [PATCH] crimson/.../osd_operation.h: add RemoteOperation Subsequent commits will switch various ops to inherit from this thereby removing some boilerplate. Signed-off-by: Samuel Just --- src/crimson/osd/osd_operation.h | 56 +++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/crimson/osd/osd_operation.h b/src/crimson/osd/osd_operation.h index 7f6d32c20140c..33f3b10ee9b0a 100644 --- a/src/crimson/osd/osd_operation.h +++ b/src/crimson/osd/osd_operation.h @@ -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 TrackableOperationT : public OperationT { T* that() { -- 2.39.5