storable blobs
This commit is contained in:
parent
36a0add0cd
commit
d4d40be870
@ -7,6 +7,7 @@ use types::{EthSpec, MinimalEthSpec};
|
|||||||
pub const PREV_DEFAULT_SLOTS_PER_RESTORE_POINT: u64 = 2048;
|
pub const PREV_DEFAULT_SLOTS_PER_RESTORE_POINT: u64 = 2048;
|
||||||
pub const DEFAULT_SLOTS_PER_RESTORE_POINT: u64 = 8192;
|
pub const DEFAULT_SLOTS_PER_RESTORE_POINT: u64 = 8192;
|
||||||
pub const DEFAULT_BLOCK_CACHE_SIZE: usize = 5;
|
pub const DEFAULT_BLOCK_CACHE_SIZE: usize = 5;
|
||||||
|
pub const DEFAULT_BLOB_CACHE_SIZE: usize = 5;
|
||||||
|
|
||||||
/// Database configuration parameters.
|
/// Database configuration parameters.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
@ -17,6 +18,8 @@ pub struct StoreConfig {
|
|||||||
pub slots_per_restore_point_set_explicitly: bool,
|
pub slots_per_restore_point_set_explicitly: bool,
|
||||||
/// Maximum number of blocks to store in the in-memory block cache.
|
/// Maximum number of blocks to store in the in-memory block cache.
|
||||||
pub block_cache_size: usize,
|
pub block_cache_size: usize,
|
||||||
|
/// Maximum number of blobs to store in the in-memory block cache.
|
||||||
|
pub blob_cache_size: usize,
|
||||||
/// Whether to compact the database on initialization.
|
/// Whether to compact the database on initialization.
|
||||||
pub compact_on_init: bool,
|
pub compact_on_init: bool,
|
||||||
/// Whether to compact the database during database pruning.
|
/// Whether to compact the database during database pruning.
|
||||||
@ -41,6 +44,7 @@ impl Default for StoreConfig {
|
|||||||
slots_per_restore_point: MinimalEthSpec::slots_per_historical_root() as u64,
|
slots_per_restore_point: MinimalEthSpec::slots_per_historical_root() as u64,
|
||||||
slots_per_restore_point_set_explicitly: false,
|
slots_per_restore_point_set_explicitly: false,
|
||||||
block_cache_size: DEFAULT_BLOCK_CACHE_SIZE,
|
block_cache_size: DEFAULT_BLOCK_CACHE_SIZE,
|
||||||
|
blob_cache_size: DEFAULT_BLOB_CACHE_SIZE,
|
||||||
compact_on_init: false,
|
compact_on_init: false,
|
||||||
compact_on_prune: true,
|
compact_on_prune: true,
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ use std::path::Path;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use types::*;
|
use types::*;
|
||||||
|
use types::signed_blobs_sidecar::SignedBlobsSidecar;
|
||||||
|
|
||||||
/// On-disk database that stores finalized states efficiently.
|
/// On-disk database that stores finalized states efficiently.
|
||||||
///
|
///
|
||||||
@ -59,6 +60,8 @@ pub struct HotColdDB<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> {
|
|||||||
///
|
///
|
||||||
/// The hot database also contains all blocks.
|
/// The hot database also contains all blocks.
|
||||||
pub hot_db: Hot,
|
pub hot_db: Hot,
|
||||||
|
/// LRU cache of deserialized blobs. Updated whenever a blob is loaded.
|
||||||
|
blob_cache: Mutex<LruCache<Hash256, SignedBlobsSidecar<E>>>,
|
||||||
/// LRU cache of deserialized blocks. Updated whenever a block is loaded.
|
/// LRU cache of deserialized blocks. Updated whenever a block is loaded.
|
||||||
block_cache: Mutex<LruCache<Hash256, SignedBeaconBlock<E>>>,
|
block_cache: Mutex<LruCache<Hash256, SignedBeaconBlock<E>>>,
|
||||||
/// Chain spec.
|
/// Chain spec.
|
||||||
@ -128,6 +131,7 @@ impl<E: EthSpec> HotColdDB<E, MemoryStore<E>, MemoryStore<E>> {
|
|||||||
cold_db: MemoryStore::open(),
|
cold_db: MemoryStore::open(),
|
||||||
hot_db: MemoryStore::open(),
|
hot_db: MemoryStore::open(),
|
||||||
block_cache: Mutex::new(LruCache::new(config.block_cache_size)),
|
block_cache: Mutex::new(LruCache::new(config.block_cache_size)),
|
||||||
|
blob_cache: Mutex::new(LruCache::new(config.blob_cache_size)),
|
||||||
config,
|
config,
|
||||||
spec,
|
spec,
|
||||||
log,
|
log,
|
||||||
@ -161,6 +165,7 @@ impl<E: EthSpec> HotColdDB<E, LevelDB<E>, LevelDB<E>> {
|
|||||||
cold_db: LevelDB::open(cold_path)?,
|
cold_db: LevelDB::open(cold_path)?,
|
||||||
hot_db: LevelDB::open(hot_path)?,
|
hot_db: LevelDB::open(hot_path)?,
|
||||||
block_cache: Mutex::new(LruCache::new(config.block_cache_size)),
|
block_cache: Mutex::new(LruCache::new(config.block_cache_size)),
|
||||||
|
blob_cache: Mutex::new(LruCache::new(config.blob_cache_size)),
|
||||||
config,
|
config,
|
||||||
spec,
|
spec,
|
||||||
log,
|
log,
|
||||||
@ -453,6 +458,31 @@ impl<E: EthSpec, Hot: ItemStore<E>, Cold: ItemStore<E>> HotColdDB<E, Hot, Cold>
|
|||||||
.key_delete(DBColumn::ExecPayload.into(), block_root.as_bytes())
|
.key_delete(DBColumn::ExecPayload.into(), block_root.as_bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn put_blobs(&self,
|
||||||
|
block_root: &Hash256,
|
||||||
|
blobs: SignedBlobsSidecar<E>,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
self.hot_db.put_bytes(DBColumn::BeaconBlob.into(), block_root.as_bytes(), &blobs.as_ssz_bytes())?;
|
||||||
|
self.blob_cache.lock().push(*block_root, blobs);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_blobs(&self,
|
||||||
|
block_root: &Hash256,
|
||||||
|
) -> Result<Option<SignedBlobsSidecar<E>>, Error> {
|
||||||
|
if let Some(blobs) = self.blob_cache.lock().get(block_root) {
|
||||||
|
Ok(Some(blobs.clone()))
|
||||||
|
} else {
|
||||||
|
if let Some(bytes) = self.hot_db.get_bytes(DBColumn::BeaconBlob.into(), block_root.as_bytes())? {
|
||||||
|
let ret = SignedBlobsSidecar::from_ssz_bytes(&bytes)?;
|
||||||
|
self.blob_cache.lock().put(*block_root, ret.clone());
|
||||||
|
Ok(Some(ret))
|
||||||
|
} else {
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn put_state_summary(
|
pub fn put_state_summary(
|
||||||
&self,
|
&self,
|
||||||
state_root: &Hash256,
|
state_root: &Hash256,
|
||||||
|
@ -171,6 +171,8 @@ pub enum DBColumn {
|
|||||||
BeaconMeta,
|
BeaconMeta,
|
||||||
#[strum(serialize = "blk")]
|
#[strum(serialize = "blk")]
|
||||||
BeaconBlock,
|
BeaconBlock,
|
||||||
|
#[strum(serialize = "blo")]
|
||||||
|
BeaconBlob,
|
||||||
/// For full `BeaconState`s in the hot database (finalized or fork-boundary states).
|
/// For full `BeaconState`s in the hot database (finalized or fork-boundary states).
|
||||||
#[strum(serialize = "ste")]
|
#[strum(serialize = "ste")]
|
||||||
BeaconState,
|
BeaconState,
|
||||||
|
Loading…
Reference in New Issue
Block a user