mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-06 10:11:44 +00:00
Bound max count of lookups (#6015)
* Bound max count of lookups * Move up
This commit is contained in:
@@ -67,6 +67,12 @@ const LOOKUP_MAX_DURATION_STUCK_SECS: u64 = 15 * PARENT_DEPTH_TOLERANCE as u64;
|
||||
/// lookup at most after 4 seconds, the lookup should gain peers.
|
||||
const LOOKUP_MAX_DURATION_NO_PEERS_SECS: u64 = 10;
|
||||
|
||||
/// Lookups contain untrusted data, including blocks that have not yet been validated. In case of
|
||||
/// bugs or malicious activity we want to bound how much memory these lookups can consume. Aprox the
|
||||
/// max size of a lookup is ~ 10 MB (current max size of gossip and RPC blocks). 200 lookups can
|
||||
/// take at most 2 GB. 200 lookups allow 3 parallel chains of depth 64 (current maximum).
|
||||
const MAX_LOOKUPS: usize = 200;
|
||||
|
||||
pub enum BlockComponent<E: EthSpec> {
|
||||
Block(DownloadResult<Arc<SignedBeaconBlock<E>>>),
|
||||
Blob(DownloadResult<Arc<BlobSidecar<E>>>),
|
||||
@@ -321,24 +327,17 @@ impl<T: BeaconChainTypes> BlockLookups<T> {
|
||||
}
|
||||
}
|
||||
|
||||
// Lookups contain untrusted data, bound the total count of lookups hold in memory to reduce
|
||||
// the risk of OOM in case of bugs of malicious activity.
|
||||
if self.single_block_lookups.len() > MAX_LOOKUPS {
|
||||
warn!(self.log, "Dropping lookup reached max"; "block_root" => ?block_root);
|
||||
return false;
|
||||
}
|
||||
|
||||
// If we know that this lookup has unknown parent (is awaiting a parent lookup to resolve),
|
||||
// signal here to hold processing downloaded data.
|
||||
let mut lookup = SingleBlockLookup::new(block_root, peers, cx.next_id(), awaiting_parent);
|
||||
|
||||
let msg = if block_component.is_some() {
|
||||
"Searching for components of a block with unknown parent"
|
||||
} else {
|
||||
"Searching for block components"
|
||||
};
|
||||
debug!(
|
||||
self.log,
|
||||
"{}", msg;
|
||||
"peer_ids" => ?peers,
|
||||
"block_root" => ?block_root,
|
||||
"id" => lookup.id,
|
||||
);
|
||||
metrics::inc_counter(&metrics::SYNC_LOOKUP_CREATED);
|
||||
|
||||
// Add block components to the new request
|
||||
if let Some(block_component) = block_component {
|
||||
lookup.add_child_components(block_component);
|
||||
@@ -354,6 +353,16 @@ impl<T: BeaconChainTypes> BlockLookups<T> {
|
||||
}
|
||||
};
|
||||
|
||||
debug!(
|
||||
self.log,
|
||||
"Created block lookup";
|
||||
"peer_ids" => ?peers,
|
||||
"block_root" => ?block_root,
|
||||
"awaiting_parent" => awaiting_parent.map(|root| root.to_string()).unwrap_or("none".to_owned()),
|
||||
"id" => lookup.id,
|
||||
);
|
||||
metrics::inc_counter(&metrics::SYNC_LOOKUP_CREATED);
|
||||
|
||||
let result = lookup.continue_requests(cx);
|
||||
if self.on_lookup_result(id, result, "new_current_lookup", cx) {
|
||||
self.update_metrics();
|
||||
|
||||
Reference in New Issue
Block a user