From b801954599f45225bf5100a9347a67ee33ce46cd Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Mon, 17 Feb 2020 14:54:39 -0800 Subject: [PATCH] More efficient garbage collection of cache. Iterates backwards from first entry of this generation, and forward from last entry. --- src/library.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/library.rs b/src/library.rs index e61d03e..f3d7323 100644 --- a/src/library.rs +++ b/src/library.rs @@ -11,6 +11,8 @@ use log::info; use log::warn; use photos::schemas::Album; use photos::schemas::MediaItem; +use rocksdb::Direction; +use rocksdb::IteratorMode; use rocksdb::DB; // Used to ensure DB is invalidated after schema changes. @@ -47,7 +49,16 @@ impl Library { } fn gc(generation: &str, db: &DB) -> Result<(), rocksdb::Error> { let gen = format!("{}/", generation); - for (k, _v) in db.iterator(rocksdb::IteratorMode::Start) { + // '0' is the next character after '/', so iterator's starting there would be after the + // last `gen` entry. + let next_gen = format!("{}0", generation); + for (k, _v) in db.iterator(IteratorMode::From(gen.as_bytes(), Direction::Reverse)) { + if !k.starts_with(gen.as_bytes()) { + info!("deleting stale key: {}", String::from_utf8_lossy(&k)); + db.delete(k)?; + } + } + for (k, _v) in db.iterator(IteratorMode::From(next_gen.as_bytes(), Direction::Forward)) { if !k.starts_with(gen.as_bytes()) { info!("deleting stale key: {}", String::from_utf8_lossy(&k)); db.delete(k)?;