use async_rdma::{LocalMrReadAccess, LocalMrWriteAccess, Rdma, RdmaBuilder};
use std::{
alloc::Layout,
io::{self, Write},
};
async fn send_data_to_server(rdma: &Rdma) -> io::Result<()> {
let mut lmr = rdma.alloc_local_mr(Layout::new::<[u8; 8]>())?;
let _num = lmr.as_mut_slice().write(&[1_u8; 8])?;
rdma.send(&lmr).await?;
Ok(())
}
async fn send_data_with_imm_to_server(rdma: &Rdma) -> io::Result<()> {
let mut lmr = rdma.alloc_local_mr(Layout::new::<[u8; 8]>())?;
let _num = lmr.as_mut_slice().write(&[1_u8; 8])?;
rdma.send_with_imm(&lmr, 1_u32).await?;
Ok(())
}
async fn send_lmr_to_server(rdma: &Rdma) -> io::Result<()> {
let mut lmr = rdma.alloc_local_mr(Layout::new::<[u8; 8]>())?;
println!("{:?}", *lmr.as_slice());
assert_eq!(*lmr.as_slice(), [0_u8; 8]);
let _num = lmr.as_mut_slice().write(&[1_u8; 8])?;
println!("{:?}", *lmr.as_slice());
assert_eq!(*lmr.as_slice(), [1_u8; 8]);
let _num = lmr
.get_mut(4..8)
.unwrap()
.as_mut_slice()
.write(&[2_u8; 4])?;
println!("{:?}", *lmr.as_slice());
assert_eq!(*lmr.as_slice(), [[1_u8; 4], [2_u8; 4]].concat());
rdma.send_local_mr(lmr).await?;
Ok(())
}
async fn request_then_write(rdma: &Rdma) -> io::Result<()> {
let mut rmr = rdma.request_remote_mr(Layout::new::<[u8; 8]>()).await?;
let mut lmr = rdma.alloc_local_mr(Layout::new::<[u8; 8]>())?;
let _num = lmr.as_mut_slice().write(&[1_u8; 8])?;
rdma.write(&lmr.get(4..8).unwrap(), &mut rmr.get_mut(4..8).unwrap())
.await?;
rdma.send_remote_mr(rmr).await?;
Ok(())
}
async fn request_then_write_with_imm(rdma: &Rdma) -> io::Result<()> {
let mut rmr = rdma.request_remote_mr(Layout::new::<[u8; 8]>()).await?;
let mut lmr = rdma.alloc_local_mr(Layout::new::<[u8; 8]>())?;
let _num = lmr.as_mut_slice().write(&[1_u8; 8])?;
rdma.write_with_imm(
&lmr.get(4..8).unwrap(),
&mut rmr.get_mut(4..8).unwrap(),
4_u32,
)
.await?;
rdma.send_remote_mr(rmr).await?;
Ok(())
}
async fn request_then_write_cas(rdma: &Rdma) -> io::Result<()> {
let mut rmr = rdma.request_remote_mr(Layout::new::<[u8; 8]>()).await?;
let new_value = u64::from_le_bytes([1_u8; 8]);
rdma.atomic_cas(0, new_value, &mut rmr).await?;
rdma.send_remote_mr(rmr).await?;
Ok(())
}
#[tokio::main]
async fn main() {
println!("client start");
let addr = "localhost:5555";
let mut rdma = RdmaBuilder::default().connect(addr).await.unwrap();
println!("connected");
send_data_to_server(&rdma).await.unwrap();
send_data_with_imm_to_server(&rdma).await.unwrap();
send_lmr_to_server(&rdma).await.unwrap();
request_then_write(&rdma).await.unwrap();
request_then_write_with_imm(&rdma).await.unwrap();
request_then_write_cas(&rdma).await.unwrap();
println!("client done");
for _ in 0..3 {
let rdma = rdma.new_connect(addr).await.unwrap();
println!("connected");
send_data_to_server(&rdma).await.unwrap();
send_data_with_imm_to_server(&rdma).await.unwrap();
send_lmr_to_server(&rdma).await.unwrap();
request_then_write(&rdma).await.unwrap();
request_then_write_with_imm(&rdma).await.unwrap();
request_then_write_cas(&rdma).await.unwrap();
}
println!("client done");
}