| 442 | |
| 443 | impl BatchPipeline for BatchEncoder { |
| 444 | fn add_block(&mut self, block: BaseBlock) -> Result<(), (ReorgError, Box<BaseBlock>)> { |
| 445 | if let Some(expected) = self.tip |
| 446 | && block.header.parent_hash != expected |
| 447 | { |
| 448 | return Err(( |
| 449 | ReorgError::ParentMismatch { expected, got: block.header.parent_hash }, |
| 450 | Box::new(block), |
| 451 | )); |
| 452 | } |
| 453 | |
| 454 | let number = block.header.number; |
| 455 | let hash = block.header.hash_slow(); |
| 456 | self.tip = Some(hash); |
| 457 | self.blocks.push_back(block); |
| 458 | BatcherMetrics::pending_blocks().increment(1.0); |
| 459 | |
| 460 | debug!(block = %number, pending_blocks = %self.blocks.len(), "block added to encoder queue"); |
| 461 | |
| 462 | Ok(()) |
| 463 | } |
| 464 | |
| 465 | fn step(&mut self) -> Result<StepResult, StepError> { |
| 466 | // One transition: deferred error, timeout close, or one queued block. |