1pub mod ibverbs;
12pub mod tcp;
13
14use std::fmt::Debug;
15use std::sync::Arc;
16use std::time::Duration;
17
18use anyhow::Result;
19use async_trait::async_trait;
20use hyperactor::reference;
21use serde::Deserialize;
22use serde::Serialize;
23use tokio::sync::OnceCell;
24
25use crate::RdmaOp;
26use crate::RdmaTransportLevel;
27
28#[derive(Debug, Clone)]
36pub enum RdmaRemoteBackendContext {
37 Ibverbs(
38 reference::ActorRef<ibverbs::manager_actor::IbvManagerActor>,
39 Arc<OnceCell<ibverbs::IbvBuffer>>,
40 ),
41 Tcp(reference::ActorRef<tcp::manager_actor::TcpManagerActor>),
42}
43
44impl Serialize for RdmaRemoteBackendContext {
45 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
46 match self {
47 RdmaRemoteBackendContext::Ibverbs(actor_ref, _) => serializer
48 .serialize_newtype_variant("RdmaRemoteBackendContext", 0, "Ibverbs", actor_ref),
49 RdmaRemoteBackendContext::Tcp(actor_ref) => serializer.serialize_newtype_variant(
50 "RdmaRemoteBackendContext",
51 1,
52 "Tcp",
53 actor_ref,
54 ),
55 }
56 }
57}
58
59impl<'de> Deserialize<'de> for RdmaRemoteBackendContext {
60 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
61 #[derive(Deserialize)]
62 #[serde(rename = "RdmaRemoteBackendContext")]
63 enum Repr {
64 Ibverbs(reference::ActorRef<ibverbs::manager_actor::IbvManagerActor>),
65 Tcp(reference::ActorRef<tcp::manager_actor::TcpManagerActor>),
66 }
67
68 match Repr::deserialize(deserializer)? {
69 Repr::Ibverbs(actor_ref) => Ok(RdmaRemoteBackendContext::Ibverbs(
70 actor_ref,
71 Arc::new(OnceCell::new()),
72 )),
73 Repr::Tcp(actor_ref) => Ok(RdmaRemoteBackendContext::Tcp(actor_ref)),
74 }
75 }
76}
77
78#[async_trait]
88pub trait RdmaBackend: Send + Debug {
89 type TransportInfo;
92
93 async fn submit(
98 &mut self,
99 cx: &(impl hyperactor::context::Actor + Send + Sync),
100 ops: Vec<RdmaOp>,
101 timeout: Duration,
102 ) -> Result<()>;
103
104 fn transport_level(&self) -> RdmaTransportLevel;
106
107 fn transport_info(&self) -> Option<Self::TransportInfo>;
110}