summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-03-05 11:07:41 +0200
committerLars Wirzenius <liw@liw.fi>2021-03-05 11:16:52 +0200
commitef3960bd60a571a7c4a5b50cfefa8d7ba29a521b (patch)
treec5a38c84afe97d4f977f43ed466c61426e8a8a03
parent5e4bbf7131660a41fd9460225c763b9a6ea4bdce (diff)
downloadobnam2-ef3960bd60a571a7c4a5b50cfefa8d7ba29a521b.tar.gz
perf: allow benchmark-indexedstore do lookups by checksum
-rw-r--r--src/bin/benchmark-indexedstore.rs77
1 files changed, 68 insertions, 9 deletions
diff --git a/src/bin/benchmark-indexedstore.rs b/src/bin/benchmark-indexedstore.rs
index 3ee4c38..9783c3c 100644
--- a/src/bin/benchmark-indexedstore.rs
+++ b/src/bin/benchmark-indexedstore.rs
@@ -1,28 +1,87 @@
use obnam::benchmark::ChunkGenerator;
use obnam::indexedstore::IndexedStore;
-use std::path::PathBuf;
+use std::path::{Path, PathBuf};
use structopt::StructOpt;
#[derive(Debug, StructOpt)]
-#[structopt(name = "benchmark-store", about = "Benhcmark the store without HTTP")]
-struct Opt {
- #[structopt(parse(from_os_str))]
- chunks: PathBuf,
+#[structopt(
+ name = "benchmark-indexedstore",
+ about = "Benhcmark the store without HTTP"
+)]
+enum Opt {
+ Create {
+ #[structopt(parse(from_os_str))]
+ chunks: PathBuf,
- #[structopt()]
- num: u32,
+ #[structopt()]
+ num: u32,
+ },
+
+ Lookup {
+ #[structopt(parse(from_os_str))]
+ chunks: PathBuf,
+
+ #[structopt()]
+ warmup_count: u32,
+
+ #[structopt()]
+ hot_count: u32,
+ },
}
fn main() -> anyhow::Result<()> {
pretty_env_logger::init();
let opt = Opt::from_args();
- let gen = ChunkGenerator::new(opt.num);
- let mut store = IndexedStore::new(&opt.chunks)?;
+ match opt {
+ Opt::Create { chunks, num } => create(&chunks, num)?,
+ Opt::Lookup {
+ chunks,
+ warmup_count,
+ hot_count,
+ } => {
+ let mut index = IndexedStore::new(&chunks)?;
+ warmup(&mut index, warmup_count)?;
+ hot(&mut index, hot_count)?;
+ }
+ }
+
+ Ok(())
+}
+
+fn create(chunks: &Path, num: u32) -> anyhow::Result<()> {
+ let mut store = IndexedStore::new(chunks)?;
+ let gen = ChunkGenerator::new(num);
+
for (_, _, meta, chunk) in gen {
store.save(&meta, &chunk)?;
}
Ok(())
}
+
+fn warmup(index: &mut IndexedStore, num: u32) -> anyhow::Result<()> {
+ println!("warming up cache");
+ lookup(index, num)
+}
+
+fn hot(index: &mut IndexedStore, num: u32) -> anyhow::Result<()> {
+ println!("using hot cache");
+ lookup(index, num)
+}
+
+fn lookup(index: &mut IndexedStore, num: u32) -> anyhow::Result<()> {
+ let mut done = 0;
+
+ loop {
+ let gen = ChunkGenerator::new(num);
+ for (_, _, meta, _) in gen {
+ index.find_by_sha256(&meta.sha256())?;
+ done += 1;
+ if done >= num {
+ return Ok(());
+ }
+ }
+ }
+}