Skip to content

Commit 86c92e1

Browse files
committed
Change BlockScanner to return a list of Blocks instead of a list of Transactions
1 parent 3751bb7 commit 86c92e1

File tree

3 files changed

+191
-134
lines changed

3 files changed

+191
-134
lines changed

mithril-aggregator/src/services/cardano_transactions_importer.rs

Lines changed: 53 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,13 @@ impl CardanoTransactionsImporter {
7979
return Ok(());
8080
}
8181

82-
let parsed_transactions = self.block_scanner.parse(&self.dirpath, from, until).await?;
82+
// todo: temp algorithm, should be optimized to avoid loading all blocks & transactions
83+
// at once in memory (probably using iterators)
84+
let scanned_blocks = self.block_scanner.scan(&self.dirpath, from, until).await?;
85+
let parsed_transactions: Vec<CardanoTransaction> = scanned_blocks
86+
.into_iter()
87+
.flat_map(|b| b.into_transactions())
88+
.collect();
8389
debug!(
8490
self.logger,
8591
"TransactionsImporter retrieved '{}' Cardano transactions between immutables '{}' and '{until}'",
@@ -114,6 +120,8 @@ mod tests {
114120
use mockall::mock;
115121
use mockall::predicate::eq;
116122

123+
use mithril_common::cardano_block_scanner::ScannedBlock;
124+
117125
use crate::database::repository::CardanoTransactionRepository;
118126
use crate::database::test_helper::cardano_tx_db_connection;
119127

@@ -124,19 +132,23 @@ mod tests {
124132

125133
#[async_trait]
126134
impl BlockScanner for BlockScannerImpl {
127-
async fn parse(
135+
async fn scan(
128136
&self,
129137
dirpath: &Path,
130138
from_immutable: Option<ImmutableFileNumber>,
131139
until_immutable: ImmutableFileNumber,
132-
) -> StdResult<Vec<CardanoTransaction>>;
140+
) -> StdResult<Vec<ScannedBlock>>;
133141
}
134142
}
135143

136-
fn build_importer(
137-
scanner_mock_config: &dyn Fn(&mut MockBlockScannerImpl),
138-
store_mock_config: &dyn Fn(&mut MockTransactionStore),
139-
) -> CardanoTransactionsImporter {
144+
fn build_importer<TParser, TStore>(
145+
scanner_mock_config: TParser,
146+
store_mock_config: TStore,
147+
) -> CardanoTransactionsImporter
148+
where
149+
TParser: FnOnce(&mut MockBlockScannerImpl),
150+
TStore: FnOnce(&mut MockTransactionStore),
151+
{
140152
let db_path = Path::new("");
141153
let mut scanner = MockBlockScannerImpl::new();
142154
scanner_mock_config(&mut scanner);
@@ -156,23 +168,24 @@ mod tests {
156168

157169
#[tokio::test]
158170
async fn if_nothing_stored_parse_and_store_all_transactions() {
159-
let transactions = vec![
160-
CardanoTransaction::new("tx_hash-1", 10, 15, "block_hash-1", 11),
161-
CardanoTransaction::new("tx_hash-2", 10, 20, "block_hash-1", 11),
162-
CardanoTransaction::new("tx_hash-3", 20, 25, "block_hash-2", 12),
163-
CardanoTransaction::new("tx_hash-4", 20, 30, "block_hash-2", 12),
171+
let blocks = vec![
172+
ScannedBlock::new("block_hash-1", 10, 15, 11, vec!["tx_hash-1", "tx_hash-2"]),
173+
ScannedBlock::new("block_hash-2", 20, 25, 12, vec!["tx_hash-3", "tx_hash-4"]),
164174
];
175+
let transactions: Vec<CardanoTransaction> = blocks
176+
.iter()
177+
.flat_map(|b| b.clone().into_transactions())
178+
.collect();
165179
let up_to_beacon = 12;
166180

167181
let importer = build_importer(
168-
&|scanner_mock| {
169-
let parsed_transactions = transactions.clone();
182+
|scanner_mock| {
170183
scanner_mock
171-
.expect_parse()
184+
.expect_scan()
172185
.withf(move |_, from, until| from.is_none() && until == &up_to_beacon)
173-
.return_once(move |_, _, _| Ok(parsed_transactions));
186+
.return_once(move |_, _, _| Ok(blocks));
174187
},
175-
&|store_mock| {
188+
|store_mock| {
176189
let expected_stored_transactions = transactions.clone();
177190
store_mock
178191
.expect_get_highest_beacon()
@@ -196,10 +209,10 @@ mod tests {
196209
let up_to_beacon = 12;
197210

198211
let importer = build_importer(
199-
&|scanner_mock| {
200-
scanner_mock.expect_parse().never();
212+
|scanner_mock| {
213+
scanner_mock.expect_scan().never();
201214
},
202-
&|store_mock| {
215+
|store_mock| {
203216
store_mock
204217
.expect_get_highest_beacon()
205218
.returning(|| Ok(Some(12)));
@@ -215,23 +228,25 @@ mod tests {
215228

216229
#[tokio::test]
217230
async fn if_all_half_are_stored_the_other_half_is_parsed_and_stored() {
218-
let transactions = vec![
219-
CardanoTransaction::new("tx_hash-1", 10, 15, "block_hash-10", 11),
220-
CardanoTransaction::new("tx_hash-2", 20, 20, "block_hash-20", 12),
221-
CardanoTransaction::new("tx_hash-3", 30, 25, "block_hash-30", 13),
222-
CardanoTransaction::new("tx_hash-4", 40, 30, "block_hash-40", 14),
231+
let blocks = [
232+
ScannedBlock::new("block_hash-1", 10, 15, 11, vec!["tx_hash-1", "tx_hash-2"]),
233+
ScannedBlock::new("block_hash-2", 20, 25, 12, vec!["tx_hash-3", "tx_hash-4"]),
223234
];
235+
let transactions: Vec<CardanoTransaction> = blocks
236+
.iter()
237+
.flat_map(|b| b.clone().into_transactions())
238+
.collect();
224239
let up_to_beacon = 14;
225240

226241
let importer = build_importer(
227-
&|scanner_mock| {
228-
let parsed_transactions = transactions[2..=3].to_vec();
242+
|scanner_mock| {
243+
let scanned_blocks = vec![blocks[1].clone()];
229244
scanner_mock
230-
.expect_parse()
245+
.expect_scan()
231246
.withf(move |_, from, until| from == &Some(13) && until == &up_to_beacon)
232-
.return_once(move |_, _, _| Ok(parsed_transactions));
247+
.return_once(move |_, _, _| Ok(scanned_blocks));
233248
},
234-
&|store_mock| {
249+
|store_mock| {
235250
store_mock
236251
.expect_get_highest_beacon()
237252
.returning(|| Ok(Some(12)));
@@ -253,19 +268,18 @@ mod tests {
253268
#[tokio::test]
254269
async fn importing_twice_starting_with_nothing_in_a_real_db_should_yield_the_transactions_in_same_order(
255270
) {
256-
let transactions = vec![
257-
CardanoTransaction::new("tx_hash-1", 10, 15, "block_hash-1", 11),
258-
CardanoTransaction::new("tx_hash-2", 10, 20, "block_hash-1", 11),
259-
CardanoTransaction::new("tx_hash-3", 20, 25, "block_hash-2", 12),
260-
CardanoTransaction::new("tx_hash-4", 20, 30, "block_hash-2", 12),
271+
let blocks = vec![
272+
ScannedBlock::new("block_hash-1", 10, 15, 11, vec!["tx_hash-1", "tx_hash-2"]),
273+
ScannedBlock::new("block_hash-2", 20, 25, 12, vec!["tx_hash-3", "tx_hash-4"]),
261274
];
275+
let transactions: Vec<CardanoTransaction> = blocks
276+
.iter()
277+
.flat_map(|b| b.clone().into_transactions())
278+
.collect();
262279
let importer = {
263280
let connection = cardano_tx_db_connection().unwrap();
264-
let parsed_transactions = transactions.clone();
265281
let mut scanner = MockBlockScannerImpl::new();
266-
scanner
267-
.expect_parse()
268-
.return_once(move |_, _, _| Ok(parsed_transactions));
282+
scanner.expect_scan().return_once(move |_, _, _| Ok(blocks));
269283

270284
CardanoTransactionsImporter::new(
271285
Arc::new(scanner),

0 commit comments

Comments
 (0)