mod client;
mod service;
pub use client::VeloWorkerClient;
pub use service::{VeloWorkerService, VeloWorkerServiceBuilder};
use super::DirectWorker;
use super::*;
use kvbm_physical::layout::LayoutConfig;
use kvbm_physical::transfer::TransferOptions;
use ::velo::Messenger;
use bytes::Bytes;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone)]
struct SerializableTransferOptions {
layer_range: Option<std::ops::Range<usize>>,
nixl_write_notification: Option<u64>,
bounce_buffer_handle: Option<LayoutHandle>,
bounce_buffer_block_ids: Option<Vec<BlockId>>,
}
impl From<SerializableTransferOptions> for TransferOptions {
fn from(opts: SerializableTransferOptions) -> Self {
TransferOptions {
layer_range: opts.layer_range,
nixl_write_notification: opts.nixl_write_notification,
bounce_buffer: None,
cuda_stream: None,
src_kv_layout: None,
dst_kv_layout: None,
}
}
}
impl SerializableTransferOptions {
fn bounce_buffer_parts(&self) -> Option<(LayoutHandle, Vec<BlockId>)> {
match (&self.bounce_buffer_handle, &self.bounce_buffer_block_ids) {
(Some(handle), Some(block_ids)) => Some((*handle, block_ids.clone())),
_ => None,
}
}
}
impl From<TransferOptions> for SerializableTransferOptions {
fn from(opts: TransferOptions) -> Self {
let (bounce_buffer_handle, bounce_buffer_block_ids) = opts
.bounce_buffer
.map(|bb| {
let (handle, block_ids) = bb.into_parts();
(Some(handle), Some(block_ids))
})
.unwrap_or((None, None));
Self {
layer_range: opts.layer_range,
nixl_write_notification: opts.nixl_write_notification,
bounce_buffer_handle,
bounce_buffer_block_ids,
}
}
}
#[derive(Serialize, Deserialize)]
struct LocalTransferMessage {
src: LogicalLayoutHandle,
dst: LogicalLayoutHandle,
src_block_ids: Vec<BlockId>,
dst_block_ids: Vec<BlockId>,
options: SerializableTransferOptions,
}
#[derive(Serialize, Deserialize)]
struct RemoteOnboardMessage {
src: RemoteDescriptor,
dst: LogicalLayoutHandle,
dst_block_ids: Vec<BlockId>,
options: SerializableTransferOptions,
}
#[derive(Serialize, Deserialize)]
struct RemoteOffloadMessage {
src: LogicalLayoutHandle,
dst: RemoteDescriptor,
src_block_ids: Vec<BlockId>,
options: SerializableTransferOptions,
}
#[derive(Serialize, Deserialize)]
struct ConnectRemoteMessage {
instance_id: InstanceId,
metadata: Vec<Vec<u8>>,
}
#[derive(Serialize, Deserialize)]
struct ExecuteRemoteOnboardForInstanceMessage {
instance_id: InstanceId,
remote_logical_type: LogicalLayoutHandle,
src_block_ids: Vec<BlockId>,
dst: LogicalLayoutHandle,
dst_block_ids: Vec<BlockId>,
options: SerializableTransferOptions,
}
#[derive(Serialize, Deserialize)]
struct ObjectHasBlocksMessage {
keys: Vec<SequenceHash>,
}
#[derive(Serialize, Deserialize)]
struct ObjectHasBlocksResponse {
results: Vec<(SequenceHash, Option<usize>)>,
}
#[derive(Serialize, Deserialize)]
struct ObjectPutBlocksMessage {
keys: Vec<SequenceHash>,
layout: LogicalLayoutHandle,
block_ids: Vec<BlockId>,
}
#[derive(Serialize, Deserialize)]
struct ObjectGetBlocksMessage {
keys: Vec<SequenceHash>,
layout: LogicalLayoutHandle,
block_ids: Vec<BlockId>,
}
#[derive(Serialize, Deserialize)]
struct ObjectPutGetBlocksResponse {
results: Vec<(bool, SequenceHash)>,
}
impl ObjectPutGetBlocksResponse {
fn from_results(results: Vec<Result<SequenceHash, SequenceHash>>) -> Self {
Self {
results: results
.into_iter()
.map(|r| match r {
Ok(k) => (true, k),
Err(k) => (false, k),
})
.collect(),
}
}
fn into_results(self) -> Vec<Result<SequenceHash, SequenceHash>> {
self.results
.into_iter()
.map(|(ok, k)| if ok { Ok(k) } else { Err(k) })
.collect()
}
}