From a31bba19b04d0cb3346ded88b21c72b1d9e3c146 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 28 Jun 2021 15:14:49 +0300 Subject: [PATCH] Compact RocksDB database after garbage collection. Without this step, the page versions won't actually be removed, they're just marked for deletion on the next RocksDB "merge" or "compact" operation. Author: Konstantin Knizhnik --- pageserver/src/object_repository.rs | 1 + pageserver/src/object_store.rs | 3 +++ pageserver/src/rocksdb_storage.rs | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/pageserver/src/object_repository.rs b/pageserver/src/object_repository.rs index 70b804cc26..1a8af822bb 100644 --- a/pageserver/src/object_repository.rs +++ b/pageserver/src/object_repository.rs @@ -623,6 +623,7 @@ impl ObjectTimeline { result.elapsed = now.elapsed(); info!("Garbage collection completed in {:?}: {} relations inspected, {} version histories truncated, {} versions deleted, {} relations dropped", result.elapsed, &result.n_relations, &result.truncated, &result.deleted, &result.dropped); + self.obj_store.compact(); } Ok(()) } diff --git a/pageserver/src/object_store.rs b/pageserver/src/object_store.rs index 56d1392ab8..d1c2b5a09d 100644 --- a/pageserver/src/object_store.rs +++ b/pageserver/src/object_store.rs @@ -68,4 +68,7 @@ pub trait ObjectStore: Send + Sync { /// Unlink object (used by GC). This mehod may actually delete object or just mark it for deletion. fn unlink(&self, key: &ObjectKey, lsn: Lsn) -> Result<()>; + + // Compact storage and remove versions marged for deletion + fn compact(&self); } diff --git a/pageserver/src/rocksdb_storage.rs b/pageserver/src/rocksdb_storage.rs index bbf484a06e..6e4c2e31e5 100644 --- a/pageserver/src/rocksdb_storage.rs +++ b/pageserver/src/rocksdb_storage.rs @@ -207,6 +207,10 @@ impl ObjectStore for RocksObjectStore { lsn, })) } + + fn compact(&self) { + self.db.compact_range::<&[u8], &[u8]>(None, None); + } } impl RocksObjectStore {