Skip to main content

reth_storage_api/
metadata.rs

1//! Metadata provider trait for reading and writing node metadata.
2
3use alloc::vec::Vec;
4use reth_db_api::models::StorageSettings;
5use reth_storage_errors::provider::{ProviderError, ProviderResult};
6
7/// Metadata keys.
8pub mod keys {
9    /// Storage configuration settings for this node.
10    pub const STORAGE_SETTINGS: &str = "storage_settings";
11}
12
13/// Client trait for reading node metadata from the database.
14#[auto_impl::auto_impl(&, Arc)]
15pub trait MetadataProvider: Send {
16    /// Get a metadata value by key
17    fn get_metadata(&self, key: &str) -> ProviderResult<Option<Vec<u8>>>;
18
19    /// Get storage settings for this node.
20    ///
21    /// If the stored metadata can't be deserialized (e.g. the format changed),
22    /// this returns `None` instead of an error so commands like `db clear` can
23    /// still operate without requiring a compatible metadata schema.
24    fn storage_settings(&self) -> ProviderResult<Option<StorageSettings>> {
25        Ok(self
26            .get_metadata(keys::STORAGE_SETTINGS)?
27            .and_then(|bytes| serde_json::from_slice(&bytes).ok()))
28    }
29}
30
31/// Client trait for writing node metadata to the database.
32pub trait MetadataWriter: Send {
33    /// Write a metadata value
34    fn write_metadata(&self, key: &str, value: Vec<u8>) -> ProviderResult<()>;
35
36    /// Delete a metadata value.
37    fn delete_metadata(&self, _key: &str) -> ProviderResult<()> {
38        Err(ProviderError::UnsupportedProvider)
39    }
40
41    /// Write storage settings for this node
42    ///
43    /// Be sure to update provider factory cache with
44    /// [`StorageSettingsCache::set_storage_settings_cache`].
45    fn write_storage_settings(&self, settings: StorageSettings) -> ProviderResult<()> {
46        self.write_metadata(
47            keys::STORAGE_SETTINGS,
48            serde_json::to_vec(&settings).map_err(ProviderError::other)?,
49        )
50    }
51}
52
53/// Trait for caching storage settings on a provider factory.
54pub trait StorageSettingsCache: Send {
55    /// Gets the cached storage settings.
56    fn cached_storage_settings(&self) -> StorageSettings;
57
58    /// Sets the storage settings of this `ProviderFactory`.
59    ///
60    /// IMPORTANT: It does not save settings in storage, that should be done by
61    /// [`MetadataWriter::write_storage_settings`]
62    fn set_storage_settings_cache(&self, settings: StorageSettings);
63}
64
65/// Trait for accessing the database directory path.
66#[cfg(feature = "std")]
67pub trait StoragePath: Send {
68    /// Returns the path to the database directory (e.g. `<datadir>/db`).
69    fn storage_path(&self) -> std::path::PathBuf;
70}