Skip to content

Commit 06249ef

Browse files
committed
Fix importer failing if it did not have any blockrangeroot to save
It raised an retryable error that the state machine tried immediatly to retry leading to a loop. + Refactor the import_block_range method to flatten it's code, making it more readble. + Add a log that tell which BlockRangeRoots the importer will try to compute.
1 parent 106745d commit 06249ef

File tree

4 files changed

+70
-64
lines changed

4 files changed

+70
-64
lines changed

mithril-aggregator/src/database/repository/cardano_transaction_repository.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,9 @@ impl TransactionStore for CardanoTransactionRepository {
242242
&self,
243243
block_ranges: Vec<(BlockRange, MKTreeNode)>,
244244
) -> StdResult<()> {
245-
self.create_block_ranges(block_ranges).await?;
245+
if !block_ranges.is_empty() {
246+
self.create_block_ranges(block_ranges).await?;
247+
}
246248
Ok(())
247249
}
248250
}

mithril-aggregator/src/services/cardano_transactions_importer.rs

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -123,43 +123,44 @@ impl CardanoTransactionsImporter {
123123
}
124124

125125
async fn import_block_ranges(&self) -> StdResult<()> {
126-
match self
126+
let block_ranges = match self
127127
.transaction_store
128128
.get_block_interval_without_block_range_root()
129129
.await?
130+
.map(|range| BlockRange::all_ranges_in(BlockRange::start(range.start)..range.end))
130131
{
131-
None => {
132-
// Nothing to do
133-
Ok(())
134-
}
135-
Some(range) => {
136-
let block_ranges =
137-
BlockRange::all_ranges_in(BlockRange::start(range.start)..range.end);
138-
139-
if block_ranges.is_empty() {
140-
return Ok(());
141-
}
142-
143-
let mut block_ranges_with_merkle_root: Vec<(BlockRange, MKTreeNode)> = vec![];
144-
for block_range in block_ranges {
145-
let transactions = self
146-
.transaction_store
147-
.get_transactions_between(block_range.start..block_range.end)
148-
.await?;
149-
150-
if transactions.is_empty() {
151-
continue;
152-
}
153-
154-
let merkle_root = MKTree::new(&transactions)?.compute_root()?;
155-
block_ranges_with_merkle_root.push((block_range, merkle_root));
156-
}
157-
158-
self.transaction_store
159-
.store_block_ranges(block_ranges_with_merkle_root)
160-
.await
132+
// Everything is already computed
133+
None => return Ok(()),
134+
// Not enough block to form at least one block range
135+
Some(ranges) if ranges.is_empty() => return Ok(()),
136+
Some(ranges) => ranges,
137+
};
138+
139+
debug!(
140+
self.logger,
141+
"TransactionsImporter - computing Block Range Roots";
142+
"start_block" => block_ranges.first().map(|br| br.start).unwrap_or(0),
143+
"end_block" => block_ranges.last().map(|br| br.end).unwrap_or(0),
144+
);
145+
146+
let mut block_ranges_with_merkle_root: Vec<(BlockRange, MKTreeNode)> = vec![];
147+
for block_range in block_ranges {
148+
let transactions = self
149+
.transaction_store
150+
.get_transactions_between(block_range.start..block_range.end)
151+
.await?;
152+
153+
if transactions.is_empty() {
154+
continue;
161155
}
156+
157+
let merkle_root = MKTree::new(&transactions)?.compute_root()?;
158+
block_ranges_with_merkle_root.push((block_range, merkle_root));
162159
}
160+
161+
self.transaction_store
162+
.store_block_ranges(block_ranges_with_merkle_root)
163+
.await
163164
}
164165
}
165166

mithril-signer/src/cardano_transactions_importer.rs

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -123,43 +123,44 @@ impl CardanoTransactionsImporter {
123123
}
124124

125125
async fn import_block_ranges(&self) -> StdResult<()> {
126-
match self
126+
let block_ranges = match self
127127
.transaction_store
128128
.get_block_interval_without_block_range_root()
129129
.await?
130+
.map(|range| BlockRange::all_ranges_in(BlockRange::start(range.start)..range.end))
130131
{
131-
None => {
132-
// Nothing to do
133-
Ok(())
134-
}
135-
Some(range) => {
136-
let block_ranges =
137-
BlockRange::all_ranges_in(BlockRange::start(range.start)..range.end);
138-
139-
if block_ranges.is_empty() {
140-
return Ok(());
141-
}
142-
143-
let mut block_ranges_with_merkle_root: Vec<(BlockRange, MKTreeNode)> = vec![];
144-
for block_range in block_ranges {
145-
let transactions = self
146-
.transaction_store
147-
.get_transactions_between(block_range.start..block_range.end)
148-
.await?;
149-
150-
if transactions.is_empty() {
151-
continue;
152-
}
153-
154-
let merkle_root = MKTree::new(&transactions)?.compute_root()?;
155-
block_ranges_with_merkle_root.push((block_range, merkle_root));
156-
}
157-
158-
self.transaction_store
159-
.store_block_ranges(block_ranges_with_merkle_root)
160-
.await
132+
// Everything is already computed
133+
None => return Ok(()),
134+
// Not enough block to form at least one block range
135+
Some(ranges) if ranges.is_empty() => return Ok(()),
136+
Some(ranges) => ranges,
137+
};
138+
139+
debug!(
140+
self.logger,
141+
"TransactionsImporter - computing Block Range Roots";
142+
"start_block" => block_ranges.first().map(|br| br.start).unwrap_or(0),
143+
"end_block" => block_ranges.last().map(|br| br.end).unwrap_or(0),
144+
);
145+
146+
let mut block_ranges_with_merkle_root: Vec<(BlockRange, MKTreeNode)> = vec![];
147+
for block_range in block_ranges {
148+
let transactions = self
149+
.transaction_store
150+
.get_transactions_between(block_range.start..block_range.end)
151+
.await?;
152+
153+
if transactions.is_empty() {
154+
continue;
161155
}
156+
157+
let merkle_root = MKTree::new(&transactions)?.compute_root()?;
158+
block_ranges_with_merkle_root.push((block_range, merkle_root));
162159
}
160+
161+
self.transaction_store
162+
.store_block_ranges(block_ranges_with_merkle_root)
163+
.await
163164
}
164165
}
165166

mithril-signer/src/database/repository/cardano_transaction_repository.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,9 @@ impl TransactionStore for CardanoTransactionRepository {
242242
&self,
243243
block_ranges: Vec<(BlockRange, MKTreeNode)>,
244244
) -> StdResult<()> {
245-
self.create_block_ranges(block_ranges).await?;
245+
if !block_ranges.is_empty() {
246+
self.create_block_ranges(block_ranges).await?;
247+
}
246248
Ok(())
247249
}
248250
}

0 commit comments

Comments
 (0)