From d10dfaca1e93fac71203dd3dc6851e6e1700f6ca Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Wed, 22 Jan 2025 21:22:26 +0400 Subject: [PATCH] fix(engine): attempt to advance persistence after it finished (#13928) --- crates/engine/tree/src/tree/mod.rs | 45 +++++++++++++++--------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/crates/engine/tree/src/tree/mod.rs b/crates/engine/tree/src/tree/mod.rs index cdf20d6e1b..eeed8afa9e 100644 --- a/crates/engine/tree/src/tree/mod.rs +++ b/crates/engine/tree/src/tree/mod.rs @@ -1184,28 +1184,6 @@ where /// If we're currently awaiting a response this will try to receive the response (non-blocking) /// or send a new persistence action if necessary. fn advance_persistence(&mut self) -> Result<(), AdvancePersistenceError> { - if !self.persistence_state.in_progress() { - if let Some(new_tip_num) = self.persistence_state.remove_above_state.pop_front() { - debug!(target: "engine::tree", ?new_tip_num, remove_state=?self.persistence_state.remove_above_state, last_persisted_block_number=?self.persistence_state.last_persisted_block.number, "Removing blocks using persistence task"); - if new_tip_num < self.persistence_state.last_persisted_block.number { - debug!(target: "engine::tree", ?new_tip_num, "Starting remove blocks job"); - let (tx, rx) = oneshot::channel(); - let _ = self.persistence.remove_blocks_above(new_tip_num, tx); - self.persistence_state.start(rx); - } - } else if self.should_persist() { - let blocks_to_persist = self.get_canonical_blocks_to_persist(); - if blocks_to_persist.is_empty() { - debug!(target: "engine::tree", "Returned empty set of blocks to persist"); - } else { - debug!(target: "engine::tree", blocks = ?blocks_to_persist.iter().map(|block| block.recovered_block().num_hash()).collect::>(), "Persisting blocks"); - let (tx, rx) = oneshot::channel(); - let _ = self.persistence.save_blocks(blocks_to_persist, tx); - self.persistence_state.start(rx); - } - } - } - if self.persistence_state.in_progress() { let (mut rx, start_time) = self .persistence_state @@ -1236,6 +1214,29 @@ where Err(TryRecvError::Empty) => self.persistence_state.rx = Some((rx, start_time)), } } + + if !self.persistence_state.in_progress() { + if let Some(new_tip_num) = self.persistence_state.remove_above_state.pop_front() { + debug!(target: "engine::tree", ?new_tip_num, remove_state=?self.persistence_state.remove_above_state, last_persisted_block_number=?self.persistence_state.last_persisted_block.number, "Removing blocks using persistence task"); + if new_tip_num < self.persistence_state.last_persisted_block.number { + debug!(target: "engine::tree", ?new_tip_num, "Starting remove blocks job"); + let (tx, rx) = oneshot::channel(); + let _ = self.persistence.remove_blocks_above(new_tip_num, tx); + self.persistence_state.start(rx); + } + } else if self.should_persist() { + let blocks_to_persist = self.get_canonical_blocks_to_persist(); + if blocks_to_persist.is_empty() { + debug!(target: "engine::tree", "Returned empty set of blocks to persist"); + } else { + debug!(target: "engine::tree", blocks = ?blocks_to_persist.iter().map(|block| block.recovered_block().num_hash()).collect::>(), "Persisting blocks"); + let (tx, rx) = oneshot::channel(); + let _ = self.persistence.save_blocks(blocks_to_persist, tx); + self.persistence_state.start(rx); + } + } + } + Ok(()) }