From 769da6dbddcb8bd4b91c4ea29b60f398e227bd6d Mon Sep 17 00:00:00 2001 From: ardocrat Date: Wed, 22 Apr 2026 11:43:35 +0300 Subject: [PATCH 1/3] p2p: ignore last connection attempt when there is not enough outbound peers --- servers/src/grin/seed.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/servers/src/grin/seed.rs b/servers/src/grin/seed.rs index ecc496f1..b806f1c9 100644 --- a/servers/src/grin/seed.rs +++ b/servers/src/grin/seed.rs @@ -194,7 +194,8 @@ fn monitor_peers(peers: Arc, config: p2p::P2PConfig, tx: mpsc::Sende return; } - if !peers.enough_outbound_peers() { + let enough_outbound = peers.enough_outbound_peers(); + if !enough_outbound { // loop over connected peers that can provide peer lists // ask them for their list of peers let mut connected_peers: Vec = vec![]; @@ -239,7 +240,8 @@ fn monitor_peers(peers: Arc, config: p2p::P2PConfig, tx: mpsc::Sende .iter() .filter(|p| { peers.get_connected_peer(p.addr).is_none() - && Utc::now().timestamp() - p.last_attempt >= max_attempt_delay + && (!enough_outbound + || Utc::now().timestamp() - p.last_attempt >= max_attempt_delay) }) .choose_multiple(&mut thread_rng(), max_peer_attempts / 2) { @@ -268,7 +270,9 @@ fn monitor_peers(peers: Arc, config: p2p::P2PConfig, tx: mpsc::Sende // check min 32 (max 128, if there are no healthy and unknown) random defunct peers no more often than 1 hour per peer. for dp in defuncts .iter() - .filter(|p| Utc::now().timestamp() - p.last_attempt >= max_attempt_delay) + .filter(|p| { + !enough_outbound || Utc::now().timestamp() - p.last_attempt >= max_attempt_delay + }) .choose_multiple(&mut thread_rng(), max_peer_attempts - new_peers.len()) { new_peers.push(&dp.addr); From 29f822f298393b416c8d25dbd9a3998be1d4cf82 Mon Sep 17 00:00:00 2001 From: ardocrat Date: Wed, 22 Apr 2026 23:39:56 +0300 Subject: [PATCH 2/3] pibd: do not check for max cached segments on selecting next desired segment for request --- chain/src/txhashset/desegmenter.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/chain/src/txhashset/desegmenter.rs b/chain/src/txhashset/desegmenter.rs index 69ab66f1..5ea17f63 100644 --- a/chain/src/txhashset/desegmenter.rs +++ b/chain/src/txhashset/desegmenter.rs @@ -520,9 +520,6 @@ impl Desegmenter { let mut elems_added = 0; if let Some(mut next_output_idx) = self.next_required_output_segment_index() { while (next_output_idx as usize) < total_output_segments { - if self.output_segment_cache.len() >= self.max_cached_segments { - break; - } if elems_added == max_elements / 3 { break; } @@ -547,9 +544,6 @@ impl Desegmenter { elems_added = 0; if let Some(mut next_rp_idx) = self.next_required_rangeproof_segment_index() { while (next_rp_idx as usize) < total_rangeproof_segments { - if self.rangeproof_segment_cache.len() >= self.max_cached_segments { - break; - } if elems_added == max_elements / 3 { break; } @@ -573,9 +567,6 @@ impl Desegmenter { elems_added = 0; if let Some(mut next_kernel_idx) = self.next_required_kernel_segment_index() { while (next_kernel_idx as usize) < total_kernel_segments { - if self.kernel_segment_cache.len() >= self.max_cached_segments { - break; - } if elems_added == max_elements / 3 { break; } From 03ddb5f11871fbc6417476390d69d8cfe41f05ca Mon Sep 17 00:00:00 2001 From: ardocrat Date: Thu, 23 Apr 2026 00:52:16 +0300 Subject: [PATCH 3/3] pibd: check if segment not exists at request when selecting next required --- chain/src/txhashset/desegmenter.rs | 33 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/chain/src/txhashset/desegmenter.rs b/chain/src/txhashset/desegmenter.rs index 5ea17f63..d8c41fe2 100644 --- a/chain/src/txhashset/desegmenter.rs +++ b/chain/src/txhashset/desegmenter.rs @@ -583,6 +583,16 @@ impl Desegmenter { } } + // Explicitly add segment identifier to request if not exists. + let mut maybe_add_to_request = |seg_id: SegmentTypeIdentifier| { + if return_vec.iter().any(|i| i == &seg_id) { + if return_vec.len() >= max_elements { + return_vec.pop(); + } + return_vec.push(seg_id); + } + }; + // Ensure we explicitly ask for the next output segment. if let Some(next_output_idx) = self.next_required_output_segment_index() { let seg_id = SegmentIdentifier { @@ -590,10 +600,8 @@ impl Desegmenter { idx: next_output_idx, }; if !self.has_output_segment_with_id(seg_id) { - if return_vec.len() >= max_elements { - return_vec.pop(); - } - return_vec.push(SegmentTypeIdentifier::new(SegmentType::Output, seg_id)); + let next_output_seg_id = SegmentTypeIdentifier::new(SegmentType::Output, seg_id); + maybe_add_to_request(next_output_seg_id); } } @@ -604,10 +612,8 @@ impl Desegmenter { idx: next_rp_idx, }; if !self.has_rangeproof_segment_with_id(seg_id) { - if return_vec.len() >= max_elements { - return_vec.pop(); - } - return_vec.push(SegmentTypeIdentifier::new(SegmentType::RangeProof, seg_id)); + let next_proof_seg_id = SegmentTypeIdentifier::new(SegmentType::RangeProof, seg_id); + maybe_add_to_request(next_proof_seg_id); } } @@ -619,14 +625,9 @@ impl Desegmenter { height: self.default_kernel_segment_height, idx: next_kernel_idx, }; - let next_kernel_seg_id = SegmentTypeIdentifier::new(SegmentType::Kernel, seg_id); - if !self.has_kernel_segment_with_id(seg_id) - && !return_vec.iter().any(|x| x == &next_kernel_seg_id) - { - if return_vec.len() >= max_elements { - return_vec.pop(); - } - return_vec.push(next_kernel_seg_id); + if !self.has_kernel_segment_with_id(seg_id) { + let next_kernel_seg_id = SegmentTypeIdentifier::new(SegmentType::Kernel, seg_id); + maybe_add_to_request(next_kernel_seg_id); } } if return_vec.is_empty() && self.bitmap_cache.is_some() {