diff --git a/pepper-sync/src/scan/task.rs b/pepper-sync/src/scan/task.rs index 43d1999a6..a2ffa6868 100644 --- a/pepper-sync/src/scan/task.rs +++ b/pepper-sync/src/scan/task.rs @@ -355,10 +355,14 @@ where scan_task.scan_range.priority() == ScanPriority::ScannedWithoutMapping; let mut retry_height = scan_task.scan_range.block_range().start; - let mut sapling_output_count = 0; - let mut orchard_output_count = 0; - let mut sapling_nullifier_count = 0; - let mut orchard_nullifier_count = 0; + let mut batch_sapling_output_count = 0; + let mut batch_orchard_output_count = 0; + let mut batch_sapling_nullifier_count = 0; + let mut batch_orchard_nullifier_count = 0; + let mut current_block_sapling_output_count = 0; + let mut current_block_orchard_output_count = 0; + let mut current_block_sapling_nullifier_count = 0; + let mut current_block_orchard_nullifier_count = 0; let mut first_batch = true; let mut block_stream = { @@ -454,14 +458,16 @@ where }; if fetch_nullifiers_only { - sapling_nullifier_count += compact_block + current_block_sapling_nullifier_count = compact_block .vtx .iter() .fold(0, |acc, transaction| acc + transaction.spends.len()); - orchard_nullifier_count += compact_block + batch_sapling_nullifier_count += current_block_sapling_nullifier_count; + current_block_orchard_nullifier_count = compact_block .vtx .iter() .fold(0, |acc, transaction| acc + transaction.actions.len()); + batch_orchard_nullifier_count += current_block_orchard_nullifier_count; } else { if let Some(block) = previous_task_last_block.as_ref() && scan_task.start_seam_block.is_none() @@ -499,18 +505,23 @@ where ); } - sapling_output_count += compact_block + current_block_sapling_output_count = compact_block .vtx .iter() .fold(0, |acc, transaction| acc + transaction.outputs.len()); - orchard_output_count += compact_block + batch_sapling_output_count += current_block_sapling_output_count; + current_block_orchard_output_count = compact_block .vtx .iter() .fold(0, |acc, transaction| acc + transaction.actions.len()); + batch_orchard_output_count += current_block_orchard_output_count; } - if sapling_output_count + orchard_output_count > max_batch_outputs - || sapling_nullifier_count + orchard_nullifier_count > MAX_BATCH_NULLIFIERS + if (batch_sapling_output_count + batch_orchard_output_count > max_batch_outputs + || batch_sapling_nullifier_count + batch_orchard_nullifier_count + > MAX_BATCH_NULLIFIERS) + && scan_task.scan_range.block_range().start + != get_compact_block_height(&compact_block) { let (full_batch, new_batch) = scan_task .clone() @@ -524,10 +535,10 @@ where let _ignore_error = batch_sender.send(full_batch).await; scan_task = new_batch; - sapling_output_count = 0; - orchard_output_count = 0; - sapling_nullifier_count = 0; - orchard_nullifier_count = 0; + batch_sapling_output_count = current_block_sapling_output_count; + batch_orchard_output_count = current_block_orchard_output_count; + batch_sapling_nullifier_count = current_block_sapling_nullifier_count; + batch_orchard_nullifier_count = current_block_orchard_nullifier_count; } retry_height = get_compact_block_height(&compact_block) + 1; @@ -777,7 +788,7 @@ impl ScanTask { block_height: BlockHeight, ) -> Result<(Self, Self), ServerError> { if block_height < self.scan_range.block_range().start - && block_height > self.scan_range.block_range().end - 1 + || block_height > self.scan_range.block_range().end - 1 { panic!("block height should be within scan tasks block range!"); }