mirror of
				https://github.com/0glabs/0g-storage-node.git
				synced 2025-11-04 08:37:27 +00:00 
			
		
		
		
	add detailed metrics in slow operations
This commit is contained in:
		
							parent
							
								
									d5541abdd8
								
							
						
					
					
						commit
						275a43e032
					
				
							
								
								
									
										1
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -224,6 +224,7 @@ dependencies = [
 | 
			
		||||
 "eth2_ssz_derive",
 | 
			
		||||
 "ethereum-types 0.14.1",
 | 
			
		||||
 "lazy_static",
 | 
			
		||||
 "metrics",
 | 
			
		||||
 "once_cell",
 | 
			
		||||
 "serde",
 | 
			
		||||
 "tiny-keccak",
 | 
			
		||||
 | 
			
		||||
@ -13,3 +13,5 @@ serde = { version = "1.0.137", features = ["derive"] }
 | 
			
		||||
lazy_static = "1.4.0"
 | 
			
		||||
tracing = "0.1.36"
 | 
			
		||||
once_cell = "1.19.0"
 | 
			
		||||
 | 
			
		||||
metrics = { workspace = true }
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
mod merkle_tree;
 | 
			
		||||
mod metrics;
 | 
			
		||||
mod proof;
 | 
			
		||||
mod sha3;
 | 
			
		||||
 | 
			
		||||
@ -7,6 +8,7 @@ use std::cmp::Ordering;
 | 
			
		||||
use std::collections::{BTreeMap, HashMap};
 | 
			
		||||
use std::fmt::Debug;
 | 
			
		||||
use std::marker::PhantomData;
 | 
			
		||||
use std::time::Instant;
 | 
			
		||||
use tracing::{trace, warn};
 | 
			
		||||
 | 
			
		||||
pub use crate::merkle_tree::{
 | 
			
		||||
@ -138,15 +140,18 @@ impl<E: HashElement, A: Algorithm<E>> AppendMerkleTree<E, A> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn append(&mut self, new_leaf: E) {
 | 
			
		||||
        let start_time = Instant::now();
 | 
			
		||||
        if new_leaf == E::null() {
 | 
			
		||||
            // appending null is not allowed.
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        self.layers[0].push(new_leaf);
 | 
			
		||||
        self.recompute_after_append_leaves(self.leaves() - 1);
 | 
			
		||||
        metrics::APPEND.update_since(start_time);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn append_list(&mut self, mut leaf_list: Vec<E>) {
 | 
			
		||||
        let start_time = Instant::now();
 | 
			
		||||
        if leaf_list.contains(&E::null()) {
 | 
			
		||||
            // appending null is not allowed.
 | 
			
		||||
            return;
 | 
			
		||||
@ -154,6 +159,8 @@ impl<E: HashElement, A: Algorithm<E>> AppendMerkleTree<E, A> {
 | 
			
		||||
        let start_index = self.leaves();
 | 
			
		||||
        self.layers[0].append(&mut leaf_list);
 | 
			
		||||
        self.recompute_after_append_leaves(start_index);
 | 
			
		||||
 | 
			
		||||
        metrics::APPEND_LIST.update_since(start_time);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Append a leaf list by providing their intermediate node hash.
 | 
			
		||||
@ -162,6 +169,7 @@ impl<E: HashElement, A: Algorithm<E>> AppendMerkleTree<E, A> {
 | 
			
		||||
    /// Other nodes in the subtree will be set to `null` nodes.
 | 
			
		||||
    /// TODO: Optimize to avoid storing the `null` nodes?
 | 
			
		||||
    pub fn append_subtree(&mut self, subtree_depth: usize, subtree_root: E) -> Result<()> {
 | 
			
		||||
        let start_time = Instant::now();
 | 
			
		||||
        if subtree_root == E::null() {
 | 
			
		||||
            // appending null is not allowed.
 | 
			
		||||
            bail!("subtree_root is null");
 | 
			
		||||
@ -169,10 +177,13 @@ impl<E: HashElement, A: Algorithm<E>> AppendMerkleTree<E, A> {
 | 
			
		||||
        let start_index = self.leaves();
 | 
			
		||||
        self.append_subtree_inner(subtree_depth, subtree_root)?;
 | 
			
		||||
        self.recompute_after_append_subtree(start_index, subtree_depth - 1);
 | 
			
		||||
 | 
			
		||||
        metrics::APPEND_SUBTREE.update_since(start_time);
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn append_subtree_list(&mut self, subtree_list: Vec<(usize, E)>) -> Result<()> {
 | 
			
		||||
        let start_time = Instant::now();
 | 
			
		||||
        if subtree_list.iter().any(|(_, root)| root == &E::null()) {
 | 
			
		||||
            // appending null is not allowed.
 | 
			
		||||
            bail!("subtree_list contains null");
 | 
			
		||||
@ -182,12 +193,14 @@ impl<E: HashElement, A: Algorithm<E>> AppendMerkleTree<E, A> {
 | 
			
		||||
            self.append_subtree_inner(subtree_depth, subtree_root)?;
 | 
			
		||||
            self.recompute_after_append_subtree(start_index, subtree_depth - 1);
 | 
			
		||||
        }
 | 
			
		||||
        metrics::APPEND_SUBTREE_LIST.update_since(start_time);
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Change the value of the last leaf and return the new merkle root.
 | 
			
		||||
    /// This is needed if our merkle-tree in memory only keeps intermediate nodes instead of real leaves.
 | 
			
		||||
    pub fn update_last(&mut self, updated_leaf: E) {
 | 
			
		||||
        let start_time = Instant::now();
 | 
			
		||||
        if updated_leaf == E::null() {
 | 
			
		||||
            // updating to null is not allowed.
 | 
			
		||||
            return;
 | 
			
		||||
@ -199,6 +212,7 @@ impl<E: HashElement, A: Algorithm<E>> AppendMerkleTree<E, A> {
 | 
			
		||||
            *self.layers[0].last_mut().unwrap() = updated_leaf;
 | 
			
		||||
        }
 | 
			
		||||
        self.recompute_after_append_leaves(self.leaves() - 1);
 | 
			
		||||
        metrics::UPDATE_LAST.update_since(start_time);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Fill an unknown `null` leaf with its real value.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								common/append_merkle/src/metrics.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								common/append_merkle/src/metrics.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
use std::sync::Arc;
 | 
			
		||||
 | 
			
		||||
use metrics::{register_timer, Timer};
 | 
			
		||||
 | 
			
		||||
lazy_static::lazy_static! {
 | 
			
		||||
    pub static ref APPEND: Arc<dyn Timer> = register_timer("append_merkle_append");
 | 
			
		||||
    pub static ref APPEND_LIST: Arc<dyn Timer> = register_timer("append_merkle_append_list");
 | 
			
		||||
    pub static ref APPEND_SUBTREE: Arc<dyn Timer> = register_timer("append_merkle_append_subtree");
 | 
			
		||||
    pub static ref APPEND_SUBTREE_LIST: Arc<dyn Timer> = register_timer("append_merkle_append_subtree_list");
 | 
			
		||||
    pub static ref UPDATE_LAST: Arc<dyn Timer> = register_timer("append_merkle_update_last");
 | 
			
		||||
}
 | 
			
		||||
@ -234,6 +234,7 @@ impl FlowWrite for FlowStore {
 | 
			
		||||
    /// Return the roots of completed chunks. The order is guaranteed to be increasing
 | 
			
		||||
    /// by chunk index.
 | 
			
		||||
    fn append_entries(&self, data: ChunkArray) -> Result<Vec<(u64, DataRoot)>> {
 | 
			
		||||
        let start_time = Instant::now();
 | 
			
		||||
        let mut to_seal_set = self.seal_manager.to_seal_set.write();
 | 
			
		||||
        trace!("append_entries: {} {}", data.start_index, data.data.len());
 | 
			
		||||
        if data.data.len() % BYTES_PER_SECTOR != 0 {
 | 
			
		||||
@ -276,6 +277,8 @@ impl FlowWrite for FlowStore {
 | 
			
		||||
 | 
			
		||||
            batch_list.push((chunk_index, batch));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        metrics::APPEND_ENTRIES.update_since(start_time);
 | 
			
		||||
        self.db.put_entry_batch_list(batch_list)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -385,6 +388,7 @@ impl FlowDBStore {
 | 
			
		||||
        &self,
 | 
			
		||||
        batch_list: Vec<(u64, EntryBatch)>,
 | 
			
		||||
    ) -> Result<Vec<(u64, DataRoot)>> {
 | 
			
		||||
        let start_time = Instant::now();
 | 
			
		||||
        let mut completed_batches = Vec::new();
 | 
			
		||||
        let mut tx = self.kvdb.transaction();
 | 
			
		||||
        for (batch_index, batch) in batch_list {
 | 
			
		||||
@ -405,6 +409,7 @@ impl FlowDBStore {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        self.kvdb.write(tx)?;
 | 
			
		||||
        metrics::PUT_ENTRY_BATCH_LIST.update_since(start_time);
 | 
			
		||||
        Ok(completed_batches)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1280,6 +1280,7 @@ pub fn sub_merkle_tree(leaf_data: &[u8]) -> Result<FileMerkleTree> {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn data_to_merkle_leaves(leaf_data: &[u8]) -> Result<Vec<H256>> {
 | 
			
		||||
    let start_time = Instant::now();
 | 
			
		||||
    if leaf_data.len() % ENTRY_SIZE != 0 {
 | 
			
		||||
        bail!("merkle_tree: mismatched data size");
 | 
			
		||||
    }
 | 
			
		||||
@ -1295,6 +1296,8 @@ pub fn data_to_merkle_leaves(leaf_data: &[u8]) -> Result<Vec<H256>> {
 | 
			
		||||
            .map(Sha3Algorithm::leaf)
 | 
			
		||||
            .collect()
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    metrics::DATA_TO_MERKLE_LEAVES.update_since(start_time);
 | 
			
		||||
    Ok(r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,9 @@ lazy_static::lazy_static! {
 | 
			
		||||
    pub static ref APPEND_SUBTREE_LIST: Arc<dyn Timer> =
 | 
			
		||||
        register_timer("log_store_log_manager_append_subtree_list");
 | 
			
		||||
 | 
			
		||||
    pub static ref DATA_TO_MERKLE_LEAVES: Arc<dyn Timer> =
 | 
			
		||||
        register_timer("log_store_log_manager_data_to_merkle_leaves");
 | 
			
		||||
 | 
			
		||||
    pub static ref COPY_TX_AND_FINALIZE: Arc<dyn Timer> =
 | 
			
		||||
        register_timer("log_store_log_manager_copy_tx_and_finalize");
 | 
			
		||||
 | 
			
		||||
@ -19,7 +22,12 @@ lazy_static::lazy_static! {
 | 
			
		||||
    pub static ref PUT_BATCH_ROOT_LIST: Arc<dyn Timer> = register_timer("log_store_flow_store_put_batch_root_list");
 | 
			
		||||
 | 
			
		||||
    pub static ref INSERT_SUBTREE_LIST: Arc<dyn Timer> =
 | 
			
		||||
        register_timer("log_store_log_manager_insert_subtree_list");
 | 
			
		||||
        register_timer("log_store_flow_store_insert_subtree_list");
 | 
			
		||||
 | 
			
		||||
    pub static ref PUT_MPT_NODE: Arc<dyn Timer> = register_timer("log_store_log_manager_put_mpt_node");
 | 
			
		||||
    pub static ref PUT_MPT_NODE: Arc<dyn Timer> = register_timer("log_store_flow_store_put_mpt_node");
 | 
			
		||||
 | 
			
		||||
    pub static ref PUT_ENTRY_BATCH_LIST: Arc<dyn Timer> =
 | 
			
		||||
        register_timer("log_store_flow_store_put_entry_batch_list");
 | 
			
		||||
 | 
			
		||||
    pub static ref APPEND_ENTRIES: Arc<dyn Timer> = register_timer("log_store_flow_store_append_entries");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user