From f709083425cdbe832546ab5fa66b76df433431cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Ludue=C3=B1a?= Date: Wed, 28 Jan 2026 11:51:49 -0300 Subject: [PATCH 1/2] feat: configure max dump history --- crates/core/src/config.rs | 1 + src/serve/grpc/mod.rs | 4 +++- src/serve/grpc/sync.rs | 19 +++++++++++-------- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/crates/core/src/config.rs b/crates/core/src/config.rs index 0ad6241c6..fc12f6353 100644 --- a/crates/core/src/config.rs +++ b/crates/core/src/config.rs @@ -561,6 +561,7 @@ pub struct GrpcConfig { pub listen_address: String, pub tls_client_ca_root: Option, pub permissive_cors: Option, + pub max_dump_history_items: Option, } #[derive(Deserialize, Serialize, Clone)] diff --git a/src/serve/grpc/mod.rs b/src/serve/grpc/mod.rs index 2ac6b2644..2e496e2ba 100644 --- a/src/serve/grpc/mod.rs +++ b/src/serve/grpc/mod.rs @@ -28,8 +28,10 @@ where async fn run(cfg: Self::Config, domain: D, cancel: C) -> Result<(), ServeError> { let addr = cfg.listen_address.parse().unwrap(); + let max_history_items = cfg.max_dump_history_items.unwrap_or(100); - let sync_service = sync::SyncServiceImpl::new(domain.clone(), cancel.clone()); + let sync_service = + sync::SyncServiceImpl::new(domain.clone(), cancel.clone(), max_history_items); let sync_service = u5c::sync::sync_service_server::SyncServiceServer::new(sync_service); let query_service = query::QueryServiceImpl::new(domain.clone()); diff --git a/src/serve/grpc/sync.rs b/src/serve/grpc/sync.rs index 179920012..f14b30048 100644 --- a/src/serve/grpc/sync.rs +++ b/src/serve/grpc/sync.rs @@ -10,8 +10,6 @@ use tonic::{Request, Response, Status}; use crate::prelude::*; -const MAX_DUMP_HISTORY_ITEMS: u32 = 100; - fn u5c_to_chain_point(block_ref: u5c::sync::BlockRef) -> Result { Ok(ChainPoint::Specific( block_ref.slot, @@ -97,6 +95,7 @@ where domain: D, mapper: interop::Mapper, cancel: C, + max_history_items: u32, } impl SyncServiceImpl @@ -104,13 +103,14 @@ where D: Domain + LedgerContext, C: CancelToken, { - pub fn new(domain: D, cancel: C) -> Self { + pub fn new(domain: D, cancel: C, max_history_items: u32) -> Self { let mapper = Mapper::new(domain.clone()); Self { domain, mapper, cancel, + max_history_items, } } } @@ -186,9 +186,10 @@ where let from = msg.start_token.map(|x| x.slot); - if msg.max_items > MAX_DUMP_HISTORY_ITEMS { + if msg.max_items > self.max_history_items { return Err(Status::invalid_argument(format!( - "max_items must be less than or equal to {MAX_DUMP_HISTORY_ITEMS}" + "max_items must be less than or equal to {}", + self.max_history_items ))); } @@ -288,7 +289,7 @@ mod tests { use dolos_core::ImportExt; domain.import_blocks(batch).unwrap(); - let service = SyncServiceImpl::new(domain, cancel); + let service = SyncServiceImpl::new(domain, cancel, 100); let mut start_token = None; @@ -331,11 +332,13 @@ mod tests { let domain = ToyDomain::new(None, None); let cancel = CancelTokenImpl::default(); - let service = SyncServiceImpl::new(domain, cancel); + let max_configurable = 10; + + let service = SyncServiceImpl::new(domain, cancel, max_configurable); let request = u5c::sync::DumpHistoryRequest { start_token: None, - max_items: MAX_DUMP_HISTORY_ITEMS + 1, + max_items: max_configurable + 1, field_mask: None, }; From 2b6ca208b65442a84de23e9c00f1f97e88814104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Ludue=C3=B1a?= Date: Wed, 28 Jan 2026 11:58:35 -0300 Subject: [PATCH 2/2] fix: missing config on dolos init --- src/bin/dolos/init.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bin/dolos/init.rs b/src/bin/dolos/init.rs index 1009469d5..e394ce413 100644 --- a/src/bin/dolos/init.rs +++ b/src/bin/dolos/init.rs @@ -310,6 +310,7 @@ impl ConfigEditor { listen_address: "[::]:50051".into(), tls_client_ca_root: None, permissive_cors: Some(true), + max_dump_history_items: None, } .into(); } else {