reth_storage_api/
metadata.rs

1//! Metadata provider trait for reading and writing node metadata.
2
3use reth_db_api::models::StorageSettings;
4use reth_storage_errors::provider::{ProviderError, ProviderResult};
5
6/// Metadata keys.
7pub mod keys {
8    /// Storage configuration settings for this node.
9    pub const STORAGE_SETTINGS: &str = "storage_settings";
10}
11
12/// Client trait for reading node metadata from the database.
13#[auto_impl::auto_impl(&, Arc)]
14pub trait MetadataProvider: Send + Sync {
15    /// Get a metadata value by key
16    fn get_metadata(&self, key: &str) -> ProviderResult<Option<Vec<u8>>>;
17
18    /// Get storage settings for this node
19    fn storage_settings(&self) -> ProviderResult<Option<StorageSettings>> {
20        self.get_metadata(keys::STORAGE_SETTINGS)?
21            .map(|bytes| serde_json::from_slice(&bytes).map_err(ProviderError::other))
22            .transpose()
23    }
24}
25
26/// Client trait for writing node metadata to the database.
27pub trait MetadataWriter: Send + Sync {
28    /// Write a metadata value
29    fn write_metadata(&self, key: &str, value: Vec<u8>) -> ProviderResult<()>;
30
31    /// Write storage settings for this node
32    ///
33    /// Be sure to update provider factory cache with
34    /// [`StorageSettingsCache::set_storage_settings_cache`].
35    fn write_storage_settings(&self, settings: StorageSettings) -> ProviderResult<()> {
36        self.write_metadata(
37            keys::STORAGE_SETTINGS,
38            serde_json::to_vec(&settings).map_err(ProviderError::other)?,
39        )
40    }
41}
42
43/// Trait for caching storage settings on a provider factory.
44pub trait StorageSettingsCache: Send + Sync {
45    /// Gets the cached storage settings.
46    fn cached_storage_settings(&self) -> StorageSettings;
47
48    /// Sets the storage settings of this `ProviderFactory`.
49    ///
50    /// IMPORTANT: It does not save settings in storage, that should be done by
51    /// [`MetadataWriter::write_storage_settings`]
52    fn set_storage_settings_cache(&self, settings: StorageSettings);
53}