diff --git a/crates/prune/src/pruner.rs b/crates/prune/src/pruner.rs index de020dcd27..96f41c9ae2 100644 --- a/crates/prune/src/pruner.rs +++ b/crates/prune/src/pruner.rs @@ -160,14 +160,18 @@ impl Pruner { return Ok(()) } }; + let total = range.clone().count(); + let mut processed = 0; provider.prune_table_in_batches::( range, self.batch_sizes.receipts, - |receipts| { + |entries| { + processed += entries; trace!( target: "pruner", - %receipts, + %entries, + progress = format!("{:.1}%", 100.0 * processed as f64 / total as f64), "Pruned receipts" ); }, @@ -201,6 +205,8 @@ impl Pruner { } }; let last_tx_num = *range.end(); + let total = range.clone().count(); + let mut processed = 0; for i in range.step_by(self.batch_sizes.transaction_lookup) { // The `min` ensures that the transaction range doesn't exceed the last transaction @@ -223,19 +229,16 @@ impl Pruner { } // Pre-sort hashes to prune them in order - hashes.sort(); + hashes.sort_unstable(); - provider.prune_table_in_batches::( - hashes, - self.batch_sizes.transaction_lookup, - |entries| { - trace!( - target: "pruner", - %entries, - "Pruned transaction lookup" - ); - }, - )?; + let entries = provider.prune_table::(hashes)?; + processed += entries; + trace!( + target: "pruner", + %entries, + progress = format!("{:.1}%", 100.0 * processed as f64 / total as f64), + "Pruned transaction lookup" + ); } provider.save_prune_checkpoint( diff --git a/crates/storage/provider/src/providers/database/provider.rs b/crates/storage/provider/src/providers/database/provider.rs index 1f871cfa29..446065457c 100644 --- a/crates/storage/provider/src/providers/database/provider.rs +++ b/crates/storage/provider/src/providers/database/provider.rs @@ -640,7 +640,7 @@ impl<'this, TX: DbTxMut<'this> + DbTx<'this>> DatabaseProvider<'this, TX> { &self, keys: impl IntoIterator, batch_size: usize, - batch_callback: impl Fn(usize), + mut batch_callback: impl FnMut(usize), ) -> std::result::Result where T: Table, @@ -650,8 +650,9 @@ impl<'this, TX: DbTxMut<'this> + DbTx<'this>> DatabaseProvider<'this, TX> { let mut deleted = 0; for key in keys { - cursor.seek_exact(key)?; - cursor.delete_current()?; + if cursor.seek_exact(key)?.is_some() { + cursor.delete_current()?; + } deleted += 1; if deleted % batch_size == 0 {