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 {