From f791e0d7ee519a52fd598e4da824a014e24192ef Mon Sep 17 00:00:00 2001 From: Shashank Date: Thu, 21 May 2026 18:04:35 +0530 Subject: [PATCH 1/2] fix swap index --- src/message_pool/msg_chain.rs | 12 +++++++++ src/message_pool/msgpool/republish.rs | 35 ++++++++++++++++++--------- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/message_pool/msg_chain.rs b/src/message_pool/msg_chain.rs index c2410db1de20..fadefa923e7e 100644 --- a/src/message_pool/msg_chain.rs +++ b/src/message_pool/msg_chain.rs @@ -235,6 +235,18 @@ impl Chains { } } + pub(in crate::message_pool) fn bubble_down_after_trim(&mut self, from: usize) { + let mut j = from; + while j < self.key_vec.len().saturating_sub(1) { + #[allow(clippy::indexing_slicing)] + if self[j].compare(&self[j + 1]) == Ordering::Less { + break; + } + self.key_vec.swap(j, j + 1); + j += 1; + } + } + pub(in crate::message_pool) fn invalidate(&mut self, mut key: Option) { let mut next_keys = vec![]; diff --git a/src/message_pool/msgpool/republish.rs b/src/message_pool/msgpool/republish.rs index e707b7e221f6..31c2bf3d18be 100644 --- a/src/message_pool/msgpool/republish.rs +++ b/src/message_pool/msgpool/republish.rs @@ -4,8 +4,6 @@ //! Tracks which CIDs were already broadcast in the current republish cycle //! and exposes a trigger to wake the republish task early. -use std::cmp::Ordering; - use crate::message::{MessageRead as _, SignedMessage}; use crate::message_pool::{ Error, @@ -174,15 +172,7 @@ where // we can't fit the current chain but there is gas to spare // trim it and push it down chains.trim_msgs_at(i, gas_limit, REPUB_MSG_LIMIT, &base_fee); - let mut j = i; - while j < chains.len() - 1 { - #[allow(clippy::indexing_slicing)] - if chains[j].compare(&chains[j + 1]) == Ordering::Less { - break; - } - chains.key_vec.swap(i, i + 1); - j += 1; - } + chains.bubble_down_after_trim(i); } if msgs.len() > REPUB_MSG_LIMIT { @@ -195,6 +185,29 @@ where #[cfg(test)] mod tests { use super::*; + use crate::message_pool::msg_chain::MsgChainNode; + use crate::shim::econ::TokenAmount; + + fn chains_from_perfs(perfs: &[f64]) -> Chains { + let mut chains = Chains::new(); + let mut key_vec = Vec::with_capacity(perfs.len()); + for (i, &p) in perfs.iter().enumerate() { + let mut node = MsgChainNode::default(); + node.gas_perf = p; + node.gas_reward = TokenAmount::from_atto(i as u64 + 1); + chains.push_with(node, &mut key_vec); + } + chains.key_vec = key_vec; + chains + } + + #[test] + fn bubble_down_after_trim_restores_compare_order() { + let mut chains = chains_from_perfs(&[1.0, 5.0, 3.0, 4.0]); + chains.bubble_down_after_trim(1); + let perfs: Vec = (0..chains.len()).map(|i| chains[i].gas_perf).collect(); + assert_eq!(perfs, vec![1.0, 3.0, 4.0, 5.0]); + } #[test] fn was_republished_reflects_replace_with() { From f46bf3aa2b955a7701a6541a1ac3d479ca927422 Mon Sep 17 00:00:00 2001 From: Shashank Date: Thu, 21 May 2026 18:49:39 +0530 Subject: [PATCH 2/2] lint fix --- src/message_pool/msgpool/republish.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/message_pool/msgpool/republish.rs b/src/message_pool/msgpool/republish.rs index 31c2bf3d18be..7dd8fb92d249 100644 --- a/src/message_pool/msgpool/republish.rs +++ b/src/message_pool/msgpool/republish.rs @@ -192,9 +192,11 @@ mod tests { let mut chains = Chains::new(); let mut key_vec = Vec::with_capacity(perfs.len()); for (i, &p) in perfs.iter().enumerate() { - let mut node = MsgChainNode::default(); - node.gas_perf = p; - node.gas_reward = TokenAmount::from_atto(i as u64 + 1); + let node = MsgChainNode { + gas_perf: p, + gas_reward: TokenAmount::from_atto(i as u64 + 1), + ..Default::default() + }; chains.push_with(node, &mut key_vec); } chains.key_vec = key_vec;