From 2705b9501b3ab9cbab63c1e55b249e6de888c267 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 5 Jun 2023 10:45:11 -0400 Subject: [PATCH] feat: revisit caching strategy --- .../src/hord/db/mod.rs | 24 ++++++++++--------- .../chainhook-event-observer/src/hord/mod.rs | 8 ++++++- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/components/chainhook-event-observer/src/hord/db/mod.rs b/components/chainhook-event-observer/src/hord/db/mod.rs index 70e73eae..b0fba9bc 100644 --- a/components/chainhook-event-observer/src/hord/db/mod.rs +++ b/components/chainhook-event-observer/src/hord/db/mod.rs @@ -714,7 +714,7 @@ pub async fn fetch_and_cache_blocks_in_hord_db( let mut cursor = start_block as usize; let mut inbox = HashMap::new(); let mut num_writes = 0; - let traversals_cache = Arc::new(new_traversals_lazy_cache()); + let traversals_cache = Arc::new(new_traversals_lazy_cache(hord_config.cache_size)); while let Ok(Some((block_height, compacted_block, raw_block))) = block_compressed_rx.recv() { insert_entry_in_blocks(block_height, &compacted_block, &blocks_db_rw, &ctx); @@ -792,18 +792,20 @@ pub async fn fetch_and_cache_blocks_in_hord_db( return Ok(()); } - if num_writes % 24 == 0 { - ctx.try_log(|logger| { - slog::info!( - logger, - "Flushing traversals cache (#{} entries)", - traversals_cache.len() - ); - }); - traversals_cache.clear(); + if !traversals_cache.is_empty() { + if num_writes % 128 == 0 { + ctx.try_log(|logger| { + slog::info!( + logger, + "Flushing traversals cache (#{} entries)", + traversals_cache.len() + ); + }); + traversals_cache.shrink_to_fit(); + } } - if num_writes % 128 == 0 { + if num_writes % 512 == 0 { ctx.try_log(|logger| { slog::info!(logger, "Flushing DB to disk ({num_writes} inserts)"); }); diff --git a/components/chainhook-event-observer/src/hord/mod.rs b/components/chainhook-event-observer/src/hord/mod.rs index 5e862885..23455977 100644 --- a/components/chainhook-event-observer/src/hord/mod.rs +++ b/components/chainhook-event-observer/src/hord/mod.rs @@ -18,6 +18,7 @@ use rocksdb::DB; use rusqlite::Connection; use std::collections::{BTreeMap, HashMap, VecDeque}; use std::hash::BuildHasherDefault; +use std::ops::Div; use std::path::PathBuf; use std::sync::mpsc::channel; use std::sync::Arc; @@ -208,9 +209,14 @@ pub fn new_traversals_cache( } pub fn new_traversals_lazy_cache( + cache_size: usize, ) -> DashMap<(u32, [u8; 8]), LazyBlockTransaction, BuildHasherDefault> { let hasher = FxBuildHasher::default(); - DashMap::with_hasher(hasher) + DashMap::with_capacity_and_hasher( + ((cache_size.saturating_sub(500)) * 1000 * 1000) + .div(LazyBlockTransaction::get_average_bytes_size()), + hasher, + ) } pub fn retrieve_inscribed_satoshi_points_from_block(