mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-19 21:04:41 +00:00
CLI flags for state cache and compression level
This commit is contained in:
@@ -1,34 +1,43 @@
|
||||
use crate::{metrics, DBColumn, Error, StoreItem};
|
||||
use crate::{
|
||||
get_key_for_col, hot_cold_store::HotColdDBError, metrics, DBColumn, Error, HotColdDB,
|
||||
ItemStore, KeyValueStore, KeyValueStoreOp,
|
||||
};
|
||||
use ssz::{Decode, Encode};
|
||||
use std::io::{Read, Write};
|
||||
use types::{beacon_state::BeaconStateDiff, EthSpec};
|
||||
use types::{beacon_state::BeaconStateDiff, EthSpec, Hash256};
|
||||
use zstd::{Decoder, Encoder};
|
||||
|
||||
const EST_COMPRESSION_FACTOR: usize = 2;
|
||||
impl<E, Hot, Cold> HotColdDB<E, Hot, Cold>
|
||||
where
|
||||
E: EthSpec,
|
||||
Hot: KeyValueStore<E> + ItemStore<E>,
|
||||
Cold: KeyValueStore<E> + ItemStore<E>,
|
||||
{
|
||||
pub fn load_state_diff(&self, state_root: Hash256) -> Result<BeaconStateDiff<E>, Error> {
|
||||
let bytes = self
|
||||
.hot_db
|
||||
.get_bytes(DBColumn::BeaconStateDiff.into(), state_root.as_bytes())?
|
||||
.ok_or(HotColdDBError::MissingStateDiff(state_root))?;
|
||||
|
||||
fn estimate_compressed_size(len: usize, compression_level: i32) -> usize {
|
||||
if compression_level == 0 {
|
||||
len
|
||||
} else {
|
||||
len / EST_COMPRESSION_FACTOR
|
||||
}
|
||||
}
|
||||
|
||||
impl<E: EthSpec> StoreItem for BeaconStateDiff<E> {
|
||||
fn db_column() -> DBColumn {
|
||||
DBColumn::BeaconStateDiff
|
||||
let mut ssz_bytes = Vec::with_capacity(self.config.estimate_decompressed_size(bytes.len()));
|
||||
let mut decoder = Decoder::new(&*bytes).map_err(Error::Compression)?;
|
||||
decoder
|
||||
.read_to_end(&mut ssz_bytes)
|
||||
.map_err(Error::Compression)?;
|
||||
Ok(BeaconStateDiff::from_ssz_bytes(&ssz_bytes)?)
|
||||
}
|
||||
|
||||
fn as_store_bytes(&self) -> Result<Vec<u8>, Error> {
|
||||
pub fn state_diff_as_bytes(&self, diff: &BeaconStateDiff<E>) -> Result<Vec<u8>, Error> {
|
||||
let encode_timer = metrics::start_timer(&metrics::BEACON_STATE_DIFF_ENCODE_TIME);
|
||||
let value = self.as_ssz_bytes();
|
||||
let value = diff.as_ssz_bytes();
|
||||
drop(encode_timer);
|
||||
|
||||
let compression_timer = metrics::start_timer(&metrics::BEACON_STATE_DIFF_COMPRESSION_TIME);
|
||||
|
||||
let level = 1;
|
||||
let mut compressed_value = Vec::with_capacity(estimate_compressed_size(value.len(), level));
|
||||
let mut encoder = Encoder::new(&mut compressed_value, level).map_err(Error::Compression)?;
|
||||
let mut compressed_value =
|
||||
Vec::with_capacity(self.config.estimate_compressed_size(value.len()));
|
||||
let mut encoder = Encoder::new(&mut compressed_value, self.config.compression_level)
|
||||
.map_err(Error::Compression)?;
|
||||
encoder.write_all(&value).map_err(Error::Compression)?;
|
||||
encoder.finish().map_err(Error::Compression)?;
|
||||
drop(compression_timer);
|
||||
@@ -48,12 +57,13 @@ impl<E: EthSpec> StoreItem for BeaconStateDiff<E> {
|
||||
Ok(compressed_value)
|
||||
}
|
||||
|
||||
fn from_store_bytes(bytes: &[u8]) -> Result<Self, Error> {
|
||||
let mut ssz_bytes = Vec::with_capacity(EST_COMPRESSION_FACTOR * bytes.len());
|
||||
let mut decoder = Decoder::new(bytes).map_err(Error::Compression)?;
|
||||
decoder
|
||||
.read_to_end(&mut ssz_bytes)
|
||||
.map_err(Error::Compression)?;
|
||||
Ok(Self::from_ssz_bytes(&ssz_bytes)?)
|
||||
pub fn state_diff_as_kv_store_op(
|
||||
&self,
|
||||
state_root: &Hash256,
|
||||
diff: &BeaconStateDiff<E>,
|
||||
) -> Result<KeyValueStoreOp, Error> {
|
||||
let key = get_key_for_col(DBColumn::BeaconStateDiff.into(), state_root.as_bytes());
|
||||
let value = self.state_diff_as_bytes(diff)?;
|
||||
Ok(KeyValueStoreOp::PutKeyValue(key, value))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user