diff --git a/crates/storage/storage-api/src/metadata.rs b/crates/storage/storage-api/src/metadata.rs index b9e08da1d0..c47c900f66 100644 --- a/crates/storage/storage-api/src/metadata.rs +++ b/crates/storage/storage-api/src/metadata.rs @@ -16,11 +16,15 @@ pub trait MetadataProvider: Send { /// Get a metadata value by key fn get_metadata(&self, key: &str) -> ProviderResult>>; - /// Get storage settings for this node + /// Get storage settings for this node. + /// + /// If the stored metadata can't be deserialized (e.g. the format changed), + /// this returns `None` instead of an error so commands like `db clear` can + /// still operate without requiring a compatible metadata schema. fn storage_settings(&self) -> ProviderResult> { - self.get_metadata(keys::STORAGE_SETTINGS)? - .map(|bytes| serde_json::from_slice(&bytes).map_err(ProviderError::other)) - .transpose() + Ok(self + .get_metadata(keys::STORAGE_SETTINGS)? + .and_then(|bytes| serde_json::from_slice(&bytes).ok())) } }