diff --git a/crates/core/src/config.rs b/crates/core/src/config.rs index 0ad6241c..fc12f635 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/bin/dolos/init.rs b/src/bin/dolos/init.rs index 1009469d..e394ce41 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 { diff --git a/src/serve/grpc/mod.rs b/src/serve/grpc/mod.rs index 2ac6b264..2e496e2b 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 17992001..f14b3004 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, };