diff --git a/rocksdb/main.cpp b/rocksdb/main.cpp index 5f81895..e160940 100644 --- a/rocksdb/main.cpp +++ b/rocksdb/main.cpp @@ -128,6 +128,10 @@ int main(int argc, char *argv[]) { } kv->Commit(); delete kv; + delete db; + // re-open db + s = rocksdb::OptimisticTransactionDB::Open(options, args.path, &db); + assert(s.ok()); } for (size_t tid = 0; tid < args.threads; ++tid) { diff --git a/src/main.rs b/src/main.rs index 8485b78..46d39d3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,7 @@ use logger::Logger; use mace::{Mace, Options}; use rand::prelude::*; use std::path::Path; +use std::process::exit; use std::sync::Arc; use std::thread::JoinHandle; use std::time::Instant; @@ -48,31 +49,32 @@ fn main() { if args.path.is_empty() { eprintln!("path is empty"); - return; + exit(1); } if path.exists() { eprintln!("path {:?} already exists", args.path); - return; + exit(1); } if args.key_size < 16 || args.value_size < 16 { eprintln!("Error: key_size or value_size too small, must >= 16"); - return; + exit(1); } if args.insert_ratio > 100 { eprintln!("Error: Insert ratio must be between 0 and 100"); - return; + exit(1); } let mut keys: Vec>> = Vec::with_capacity(args.threads); let mut opt = Options::new(path); opt.sync_on_write = false; - opt.tmp_store = true; + opt.tmp_store = args.mode != "get"; opt.gc_timeout = 1000 * 60; // make sure GC will not work + let mut saved = opt.clone(); // opt.cache_capacity = 3 << 30; // this is very important for large key-value store - let db = Mace::new(opt.validate().unwrap()).unwrap(); + let mut db = Mace::new(opt.validate().unwrap()).unwrap(); let mut rng = rand::rng(); let value = Arc::new(vec![b'0'; args.value_size]); @@ -97,6 +99,11 @@ fn main() { } }); pre_tx.commit().unwrap(); + drop(pre_tx); + drop(db); + // re-open db + saved.tmp_store = true; + db = Mace::new(saved.validate().unwrap()).unwrap(); } let barrier = Arc::new(std::sync::Barrier::new(args.threads));