diff --git a/src/directory/directory.rs b/src/directory/directory.rs index 0b57f2f61..cad3224d0 100644 --- a/src/directory/directory.rs +++ b/src/directory/directory.rs @@ -278,6 +278,12 @@ pub trait Directory: DirectoryClone + fmt::Debug + Send + Sync + 'static { ) -> Option> { None } + + /// Returns true if this directory supports garbage collection. The default assumption is + /// `true` + fn supports_garbage_collection(&self) -> bool { + true + } } /// DirectoryClone diff --git a/src/directory/managed_directory.rs b/src/directory/managed_directory.rs index d2b016a27..1dc047ba7 100644 --- a/src/directory/managed_directory.rs +++ b/src/directory/managed_directory.rs @@ -117,6 +117,13 @@ impl ManagedDirectory { &mut self, get_living_files: L, ) -> crate::Result { + if !self.supports_garbage_collection() { + // the underlying directory does not support garbage collection. + return Ok(GarbageCollectionResult { + deleted_files: vec![], + failed_to_delete_files: vec![], + }); + } let mut files_to_delete = vec![]; // We're about to do an atomic write to managed.json, lock it down @@ -359,6 +366,10 @@ impl Directory for ManagedDirectory { self.directory .reconsider_merge_policy(metas, previous_metas) } + + fn supports_garbage_collection(&self) -> bool { + self.directory.supports_garbage_collection() + } } impl Clone for ManagedDirectory {