diff --git a/crates/apps/src/lib/node/ledger/storage/rocksdb.rs b/crates/apps/src/lib/node/ledger/storage/rocksdb.rs index 7e8aa35a71..9cb9548d4f 100644 --- a/crates/apps/src/lib/node/ledger/storage/rocksdb.rs +++ b/crates/apps/src/lib/node/ledger/storage/rocksdb.rs @@ -1555,6 +1555,26 @@ impl DB for RocksDB { Ok(()) } + fn prune_non_persisted_diffs( + &mut self, + batch: &mut Self::WriteBatch, + height: BlockHeight, + ) -> Result<()> { + let subspace_cf = self.get_column_family(SUBSPACE_CF)?; + let rollback_cf = self.get_column_family(ROLLBACK_CF)?; + for (key_str, _val, _) in + iter_diffs_prefix(self, rollback_cf, height, None, true) + { + batch.0.delete_cf(subspace_cf, key_str) + } + for (key_str, _val, _) in + iter_diffs_prefix(self, rollback_cf, height, None, false) + { + batch.0.delete_cf(subspace_cf, key_str) + } + Ok(()) + } + #[inline] fn overwrite_entry( &self, diff --git a/crates/state/src/wl_state.rs b/crates/state/src/wl_state.rs index ec20360bfb..ee48f0927f 100644 --- a/crates/state/src/wl_state.rs +++ b/crates/state/src/wl_state.rs @@ -598,6 +598,10 @@ where // prune old merkle tree stores self.prune_merkle_tree_stores(&mut batch)?; } + // If there's a previous block, prune non-persisted diffs from it + if let Some(height) = self.in_mem.block.height.checked_prev() { + self.db.prune_non_persisted_diffs(&mut batch, height)?; + } self.db.exec_batch(batch)?; Ok(()) } diff --git a/crates/storage/src/db.rs b/crates/storage/src/db.rs index ac0d0a32a9..3574bd36c0 100644 --- a/crates/storage/src/db.rs +++ b/crates/storage/src/db.rs @@ -268,6 +268,13 @@ pub trait DB: Debug { batch: &mut Self::WriteBatch, ) -> Result<()>; + /// Prune non-persisted diffs that are only kept for one block for rollback + fn prune_non_persisted_diffs( + &mut self, + batch: &mut Self::WriteBatch, + height: BlockHeight, + ) -> Result<()>; + /// Overwrite a new value in storage, taking into /// account values stored at a previous height fn overwrite_entry( diff --git a/crates/storage/src/mockdb.rs b/crates/storage/src/mockdb.rs index 90cf1bccac..7f64eda47b 100644 --- a/crates/storage/src/mockdb.rs +++ b/crates/storage/src/mockdb.rs @@ -526,7 +526,8 @@ impl DB for MockDB { let diff_prefix = Key::from(height.to_db_key()); let mut db = self.0.borrow_mut(); - // Diffs + // Diffs - Note that this is different from RocksDB that has a separate + // CF for non-persisted diffs (ROLLBACK_CF) let size_diff = match db.insert(subspace_key.to_string(), value.to_owned()) { Some(prev_value) => { @@ -585,6 +586,8 @@ impl DB for MockDB { let diff_prefix = Key::from(height.to_db_key()); let mut db = self.0.borrow_mut(); + // Diffs - Note that this is different from RocksDB that has a separate + // CF for non-persisted diffs (ROLLBACK_CF) let size_diff = match db.remove(&subspace_key.to_string()) { Some(value) => { let old_key = diff_prefix @@ -691,6 +694,16 @@ impl DB for MockDB { Ok(()) } + fn prune_non_persisted_diffs( + &mut self, + _batch: &mut Self::WriteBatch, + _height: BlockHeight, + ) -> Result<()> { + // No-op - Note that this is different from RocksDB that has a separate + // CF for non-persisted diffs (ROLLBACK_CF) + Ok(()) + } + fn overwrite_entry( &self, _batch: &mut Self::WriteBatch,