#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"
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() {