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