use mongreldb_core::schema::{ColumnDef, ColumnFlags, Schema, TypeId};
use mongreldb_core::{Table, Value};
use std::io::Write;
use std::process::exit;
use std::time::{Duration, Instant};
fn schema() -> Schema {
Schema {
schema_id: 1,
columns: vec![ColumnDef {
id: 1,
name: "v".into(),
ty: TypeId::Int64,
flags: ColumnFlags::empty().with(ColumnFlags::PRIMARY_KEY),
}],
indexes: Vec::new(),
colocation: Vec::new(),
constraints: Default::default(),
}
}
fn main() {
let mut args = std::env::args().skip(1);
let (dir, mode) = match (args.next(), args.next()) {
(Some(d), Some(m)) => (std::path::PathBuf::from(d), m),
_ => {
eprintln!("usage: crash_writer <db_dir> <mode>");
exit(2);
}
};
match mode.as_str() {
"committed" => {
let mut db = Table::create(&dir, schema(), 1).expect("create");
db.put(vec![(1, Value::Int64(4242))]).expect("put");
db.commit().expect("commit");
signal("COMMITTED_READY");
spin();
}
"committed-burst" => {
let mut db = Table::create(&dir, schema(), 1).expect("create");
for v in [10i64, 20, 30] {
db.put(vec![(1, Value::Int64(v))]).expect("put");
db.commit().expect("commit");
}
signal("BURST_READY");
spin();
}
"uncommitted" => {
let mut db = Table::create(&dir, schema(), 1).expect("create");
db.set_sync_byte_threshold(1);
db.put(vec![(1, Value::Int64(9999))]).expect("put");
signal("UNCOMMITTED_READY");
spin();
}
"flush-spill" => {
let mut db = Table::create(&dir, schema(), 1).expect("create");
db.set_mutable_run_spill_bytes(1);
db.put(vec![(1, Value::Int64(7777))]).expect("put");
db.flush().expect("flush");
signal("FLUSH_READY");
spin();
}
other => {
eprintln!("unknown mode: {other}");
exit(2);
}
}
}
fn signal(msg: &str) {
println!("{msg}");
let _ = std::io::stdout().flush();
}
fn spin() {
let deadline = Instant::now() + Duration::from_secs(180);
while Instant::now() < deadline {
std::thread::sleep(Duration::from_millis(20));
}
}