use std::sync::Arc;
use crate::messenger::large_payload::{LargePayloadResolver, LargePayloadStager};
use anyhow::Result;
use bytes::Bytes;
use futures::future::BoxFuture;
use crate::RendezvousManager;
pub const DEFAULT_THRESHOLD: usize = 256 * 1024;
pub struct RendezvousStager {
manager: Arc<RendezvousManager>,
threshold: usize,
}
impl RendezvousStager {
pub fn new(manager: Arc<RendezvousManager>) -> Self {
Self {
manager,
threshold: DEFAULT_THRESHOLD,
}
}
pub fn with_threshold(mut self, threshold: usize) -> Self {
self.threshold = threshold;
self
}
}
impl LargePayloadStager for RendezvousStager {
fn stage(&self, payload: Bytes) -> String {
#[cfg(all(target_os = "linux", feature = "ucx"))]
let handle = self.manager.register_data_pinned_sync(payload);
#[cfg(not(all(target_os = "linux", feature = "ucx")))]
let handle = self.manager.register_data(payload);
handle.as_u128().to_string()
}
fn threshold(&self) -> usize {
self.threshold
}
}
pub struct RendezvousResolver {
manager: Arc<RendezvousManager>,
}
impl RendezvousResolver {
pub fn new(manager: Arc<RendezvousManager>) -> Self {
Self { manager }
}
}
impl LargePayloadResolver for RendezvousResolver {
fn resolve(&self, handle_str: &str) -> BoxFuture<'_, Result<Bytes>> {
let handle_str = handle_str.to_string();
Box::pin(async move {
let raw: u128 = handle_str
.parse()
.map_err(|e| anyhow::anyhow!("invalid rendezvous handle: {e}"))?;
let handle = crate::DataHandle::from_u128(raw);
let (data, lease_id) = self.manager.get(handle).await?;
self.manager.release(handle, lease_id).await?;
Ok(data)
})
}
}