Skip to content

Commit e3c1f75

Browse files
committed
fix(pending): close on start
1 parent 578a2f3 commit e3c1f75

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

madara/crates/client/block_production/src/lib.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,6 @@ impl BlockProductionTask {
273273
let (block, declared_classes) = get_pending_block_from_db(&self.backend)?;
274274

275275
self.backend.clear_pending_block_in_db().context("Error clearing pending block")?;
276-
self.backend.clear_pending_block_in_ram().context("Error clearing pending block")?;
277276

278277
let block_n = self.backend.get_block_n_latest().map(|n| n + 1).unwrap_or(0);
279278
self.close_and_save_block(block_n, block, declared_classes, vec![]).await?;
@@ -1122,7 +1121,7 @@ pub(crate) mod tests {
11221121
.store_block(
11231122
mp_block::MadaraMaybePendingBlock {
11241123
info: mp_block::MadaraMaybePendingBlockInfo::Pending(mp_block::MadaraPendingBlockInfo {
1125-
header: mp_block::header::PendingHeader::default(),
1124+
header: mp_block::header::PendingHeader { parent_block_number: Some(0), ..Default::default() },
11261125
tx_hashes: vec![Felt::ONE, Felt::TWO, Felt::THREE],
11271126
}),
11281127
inner: pending_inner.clone(),
@@ -1369,7 +1368,7 @@ pub(crate) mod tests {
13691368
.store_block(
13701369
mp_block::MadaraMaybePendingBlock {
13711370
info: mp_block::MadaraMaybePendingBlockInfo::Pending(mp_block::MadaraPendingBlockInfo {
1372-
header: mp_block::header::PendingHeader::default(),
1371+
header: mp_block::header::PendingHeader { parent_block_number: Some(0), ..Default::default() },
13731372
tx_hashes: vec![Felt::ONE, Felt::TWO, Felt::THREE],
13741373
}),
13751374
inner: pending_inner.clone(),

madara/crates/client/db/src/block_db.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use mp_block::{
1111
BlockId, MadaraBlock, MadaraBlockInfo, MadaraBlockInner, MadaraMaybePendingBlock, MadaraMaybePendingBlockInfo,
1212
MadaraPendingBlock, MadaraPendingBlockInfo,
1313
};
14+
use mp_rpc::BlockTag;
1415
use mp_state_update::StateDiff;
1516
use rocksdb::{Direction, IteratorMode};
1617
use starknet_api::core::ChainId;
@@ -128,7 +129,7 @@ impl MadaraBackend {
128129
let Some(res) = self.db.get_cf(&col, ROW_PENDING_INFO)? else {
129130
// See pending block quirk
130131

131-
let Some(latest_block_id) = self.get_block_n_latest() else {
132+
let Some(latest_block_id) = self.get_block_n_latest_db()? else {
132133
// Second quirk: if there is not even a genesis block in db, make up the gas prices and everything else
133134
return Ok(MadaraPendingBlockInfo {
134135
header: PendingHeader {
@@ -347,6 +348,26 @@ impl MadaraBackend {
347348
self.watch_blocks.latest_pending_block().header.parent_block_number
348349
}
349350

351+
/// This is necessary since other block_n methods will rely on the pending cache in ram to
352+
/// retrieve the latest block number. Since we need the latest block_n to initialize the pending
353+
/// cache, we use this to retrieve the block_n when the ram state has not yet been initialized.
354+
#[tracing::instrument(skip(self), fields(module = "BlockDB"))]
355+
pub fn get_block_n_latest_db(&self) -> Result<Option<u64>> {
356+
let col = self.db.get_column(Column::BlockNToBlockInfo);
357+
let iter_mode = IteratorMode::End;
358+
let mut iter = self.db.iterator_cf(&col, iter_mode);
359+
360+
iter.next()
361+
.map(|kvs| {
362+
kvs.map_err(MadaraStorageError::from).map(|(key, _)| {
363+
let mut bytes = [0u8; 8];
364+
bytes.copy_from_slice(&key);
365+
u64::from_be_bytes(bytes)
366+
})
367+
})
368+
.transpose()
369+
}
370+
350371
#[tracing::instrument(skip(self), fields(module = "BlockDB"))]
351372
pub fn get_block_n_next(&self) -> u64 {
352373
self.watch_blocks.latest_pending_block().header.parent_block_number.map(|n| n.saturating_add(1)).unwrap_or(0)

0 commit comments

Comments
 (0)