use async_rdma::{LocalMrReadAccess, Rdma, RdmaBuilder};
use clippy_utilities::Cast;
use std::{alloc::Layout, io};
async fn receive_data_from_client(rdma: &Rdma) -> io::Result<()> {
let lmr = rdma.receive().await?;
let data = *lmr.as_slice();
println!("{:?}", data);
assert_eq!(data, [1_u8; 8]);
Ok(())
}
async fn receive_data_with_imm_from_client(rdma: &Rdma) -> io::Result<()> {
let (lmr, imm) = rdma.receive_with_imm().await?;
let data = *lmr.as_slice();
println!("{:?}", data);
assert_eq!(data, [imm.unwrap().cast(); 8]);
Ok(())
}
async fn read_rmr_from_client(rdma: &Rdma) -> io::Result<()> {
let mut lmr = rdma.alloc_local_mr(Layout::new::<[u8; 8]>())?;
let rmr = rdma.receive_remote_mr().await?;
rdma.read(&mut lmr, &rmr).await?;
let data = *lmr.as_slice();
println!("{:?}", data);
assert_eq!(data, [[1_u8; 4], [2_u8; 4]].concat());
Ok(())
}
async fn receive_mr_after_being_written(rdma: &Rdma) -> io::Result<()> {
let lmr = rdma.receive_local_mr().await?;
let data = *lmr.as_slice();
println!("{:?}", data);
assert_eq!(data, [[0_u8; 4], [1_u8; 4]].concat());
Ok(())
}
async fn receive_mr_after_being_written_with_imm(rdma: &Rdma) -> io::Result<()> {
let imm = rdma.receive_write_imm().await?;
let lmr = rdma.receive_local_mr().await?;
let data = *lmr.as_slice();
println!("{:?}", data);
assert_eq!(data, [[0_u8; 4], [1_u8; 4]].concat());
assert_ne!(data[imm.wrapping_sub(1) as usize], data[imm as usize]);
Ok(())
}
async fn receive_mr_after_being_written_by_cas(rdma: &Rdma) -> io::Result<()> {
let lmr = rdma.receive_local_mr().await?;
let data = *lmr.as_slice();
println!("{:?}", data);
assert_eq!(data, [1_u8; 8]);
Ok(())
}
#[tokio::main]
async fn main() {
println!("server start");
let mut rdma = RdmaBuilder::default()
.listen("localhost:5555")
.await
.unwrap();
println!("accepted");
receive_data_from_client(&rdma).await.unwrap();
receive_data_with_imm_from_client(&rdma).await.unwrap();
read_rmr_from_client(&rdma).await.unwrap();
receive_mr_after_being_written(&rdma).await.unwrap();
receive_mr_after_being_written_with_imm(&rdma)
.await
.unwrap();
receive_mr_after_being_written_by_cas(&rdma).await.unwrap();
println!("server done");
for _ in 0..3 {
let rdma = rdma.listen().await.unwrap();
println!("accepted");
receive_data_from_client(&rdma).await.unwrap();
receive_data_with_imm_from_client(&rdma).await.unwrap();
read_rmr_from_client(&rdma).await.unwrap();
receive_mr_after_being_written(&rdma).await.unwrap();
receive_mr_after_being_written_with_imm(&rdma)
.await
.unwrap();
receive_mr_after_being_written_by_cas(&rdma).await.unwrap();
}
println!("server done");
}