use serde::{Deserialize, Serialize};
use std::cell::RefCell;
use std::rc::Rc;
use std::sync::mpsc::{Receiver, Sender};
use std::sync::Arc;
pub trait KVMap: Send + Sync + 'static {
fn handle(&self) -> Box<dyn KVMapHandle>;
fn bench(self: Box<Self>, phases: &Vec<Arc<crate::bench::Benchmark>>) {
let map = Arc::new(self);
let thread = crate::thread::DefaultThread;
crate::bench::bench_regular(map, phases, thread);
}
fn server(
self: Box<Self>,
host: &str,
port: &str,
nr_workers: usize,
stop_rx: Receiver<()>,
grace_tx: Sender<()>,
) {
let map = Arc::new(self);
let thread = crate::thread::DefaultThread;
crate::server::server_regular(map, host, port, nr_workers, stop_rx, grace_tx, thread);
}
}
pub trait KVMapHandle {
fn set(&mut self, key: &[u8], value: &[u8]);
fn get(&mut self, key: &[u8]) -> Option<Box<[u8]>>;
fn delete(&mut self, key: &[u8]);
}
#[derive(Serialize, Deserialize, Eq, PartialEq, Clone, Debug)]
pub enum Operation {
Set { key: Box<[u8]>, value: Box<[u8]> },
Get { key: Box<[u8]> },
Delete { key: Box<[u8]> },
}
#[derive(Serialize, Deserialize, Eq, PartialEq, Clone, Debug)]
pub struct Request {
pub id: usize,
pub op: Operation,
}
#[derive(Serialize, Deserialize, Eq, PartialEq, Clone, Debug)]
pub struct Response {
pub id: usize,
pub data: Option<Box<[u8]>>,
}
pub trait AsyncKVMap: Sync + Send + 'static {
fn handle(&self, responder: Rc<dyn AsyncResponder>) -> Box<dyn AsyncKVMapHandle>;
fn bench(self: Box<Self>, phases: &Vec<Arc<crate::bench::Benchmark>>) {
let map = Arc::new(self);
let thread = crate::thread::DefaultThread;
crate::bench::bench_async(map, phases, thread);
}
fn server(
self: Box<Self>,
host: &str,
port: &str,
nr_workers: usize,
stop_rx: Receiver<()>,
grace_tx: Sender<()>,
) {
let map = Arc::new(self);
let thread = crate::thread::DefaultThread;
crate::server::server_async(map, host, port, nr_workers, stop_rx, grace_tx, thread);
}
}
pub trait AsyncKVMapHandle {
fn submit(&mut self, requests: &Vec<Request>);
fn drain(&mut self);
}
pub trait AsyncResponder {
fn callback(&self, response: Response);
}
impl AsyncResponder for RefCell<Vec<Response>> {
fn callback(&self, response: Response) {
self.borrow_mut().push(response);
}
}
pub mod bench;
mod cmdline;
pub mod server;
pub mod stores;
pub mod thread;
pub mod workload;
pub use cmdline::cmdline;
pub extern crate inventory;
pub extern crate toml;