Skip to content

Commit 6f66eba

Browse files
committed
f Move Confirm method internals to _internal methods
.. which allows us to save some additional persistence and lock churn
1 parent 8a7afbc commit 6f66eba

File tree

1 file changed

+39
-18
lines changed

1 file changed

+39
-18
lines changed

lightning/src/util/sweep.rs

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,29 @@ where
574574
&Secp256k1::new(),
575575
)
576576
}
577+
578+
fn transactions_confirmed_internal(
579+
&self, sweeper_state: &mut SweeperState, header: &Header,
580+
txdata: &chain::transaction::TransactionData, height: u32,
581+
) {
582+
let confirmation_hash = header.block_hash();
583+
for (_, tx) in txdata {
584+
for output_info in sweeper_state.outputs.iter_mut() {
585+
if output_info.is_spent_in(*tx) {
586+
output_info.status.confirmed(confirmation_hash, height, (*tx).clone())
587+
}
588+
}
589+
}
590+
}
591+
592+
fn best_block_updated_internal(
593+
&self, sweeper_state: &mut SweeperState, header: &Header, height: u32,
594+
) -> Option<Transaction> {
595+
sweeper_state.best_block = BestBlock::new(header.block_hash(), height);
596+
self.prune_confirmed_outputs(sweeper_state);
597+
let spending_tx_opt = self.regenerate_spend_if_necessary(sweeper_state);
598+
spending_tx_opt
599+
}
577600
}
578601

579602
impl<B: Deref, D: Deref, E: Deref, F: Deref, K: Deref, L: Deref, O: Deref> Listen
@@ -590,16 +613,25 @@ where
590613
fn filtered_block_connected(
591614
&self, header: &Header, txdata: &chain::transaction::TransactionData, height: u32,
592615
) {
616+
let spending_tx_opt;
593617
{
594-
let state_lock = self.sweeper_state.lock().unwrap();
618+
let mut state_lock = self.sweeper_state.lock().unwrap();
595619
assert_eq!(state_lock.best_block.block_hash, header.prev_blockhash,
596-
"Blocks must be connected in chain-order - the connected header must build on the last connected header");
620+
"Blocks must be connected in chain-order - the connected header must build on the last connected header");
597621
assert_eq!(state_lock.best_block.height, height - 1,
598-
"Blocks must be connected in chain-order - the connected block height must be one greater than the previous height");
622+
"Blocks must be connected in chain-order - the connected block height must be one greater than the previous height");
623+
624+
self.transactions_confirmed_internal(&mut *state_lock, header, txdata, height);
625+
spending_tx_opt = self.best_block_updated_internal(&mut *state_lock, header, height);
626+
627+
self.persist_state(&*state_lock).unwrap_or_else(|e| {
628+
log_error!(self.logger, "Error persisting OutputSweeper: {:?}", e);
629+
});
599630
}
600631

601-
self.transactions_confirmed(header, txdata, height);
602-
self.best_block_updated(header, height);
632+
if let Some(spending_tx) = spending_tx_opt {
633+
self.broadcaster.broadcast_transactions(&[&spending_tx]);
634+
}
603635
}
604636

605637
fn block_disconnected(&self, header: &Header, height: u32) {
@@ -642,15 +674,7 @@ where
642674
&self, header: &Header, txdata: &chain::transaction::TransactionData, height: u32,
643675
) {
644676
let mut state_lock = self.sweeper_state.lock().unwrap();
645-
let confirmation_hash = header.block_hash();
646-
for (_, tx) in txdata {
647-
for output_info in state_lock.outputs.iter_mut() {
648-
if output_info.is_spent_in(*tx) {
649-
output_info.status.confirmed(confirmation_hash, height, (*tx).clone())
650-
}
651-
}
652-
}
653-
677+
self.transactions_confirmed_internal(&mut *state_lock, header, txdata, height);
654678
self.persist_state(&*state_lock).unwrap_or_else(|e| {
655679
log_error!(self.logger, "Error persisting OutputSweeper: {:?}", e);
656680
});
@@ -688,10 +712,7 @@ where
688712
let spending_tx_opt;
689713
{
690714
let mut state_lock = self.sweeper_state.lock().unwrap();
691-
state_lock.best_block = BestBlock::new(header.block_hash(), height);
692-
self.prune_confirmed_outputs(&mut *state_lock);
693-
spending_tx_opt = self.regenerate_spend_if_necessary(&mut *state_lock);
694-
715+
spending_tx_opt = self.best_block_updated_internal(&mut *state_lock, header, height);
695716
self.persist_state(&*state_lock).unwrap_or_else(|e| {
696717
log_error!(self.logger, "Error persisting OutputSweeper: {:?}", e);
697718
});

0 commit comments

Comments
 (0)