mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 15:02:20 +01:00
Convert the handle_chan_restoration_locked
macro to a function
There is no reason anymore for `handle_chan_restoration_locked` to be a macro, and our long-term desire is to move away from macros as they substantially bloat our compilation time (and binary size). Thus, we simply remove `handle_chan_restoration_locked` here and turn it into a function.
This commit is contained in:
parent
7e9b88a5cd
commit
f1c6cd8b3e
1 changed files with 74 additions and 73 deletions
|
@ -1517,76 +1517,11 @@ macro_rules! emit_channel_ready_event {
|
|||
}
|
||||
}
|
||||
|
||||
macro_rules! handle_chan_restoration_locked {
|
||||
($self: ident, $channel_state: expr, $channel_entry: expr,
|
||||
$raa: expr, $commitment_update: expr, $order: expr,
|
||||
$pending_forwards: expr, $funding_broadcastable: expr, $channel_ready: expr, $announcement_sigs: expr) => { {
|
||||
let mut htlc_forwards = None;
|
||||
|
||||
let counterparty_node_id = $channel_entry.get().get_counterparty_node_id();
|
||||
let res = loop {
|
||||
let forwards: Vec<(PendingHTLCInfo, u64)> = $pending_forwards; // Force type-checking to resolve
|
||||
if !forwards.is_empty() {
|
||||
htlc_forwards = Some(($channel_entry.get().get_short_channel_id().unwrap_or($channel_entry.get().outbound_scid_alias()),
|
||||
$channel_entry.get().get_funding_txo().unwrap(), forwards));
|
||||
}
|
||||
|
||||
if let Some(msg) = $channel_ready {
|
||||
send_channel_ready!($self, $channel_state.pending_msg_events, $channel_entry.get(), msg);
|
||||
}
|
||||
if let Some(msg) = $announcement_sigs {
|
||||
$channel_state.pending_msg_events.push(events::MessageSendEvent::SendAnnouncementSignatures {
|
||||
node_id: counterparty_node_id,
|
||||
msg,
|
||||
});
|
||||
}
|
||||
|
||||
emit_channel_ready_event!($self, $channel_entry.get_mut());
|
||||
|
||||
macro_rules! handle_cs { () => {
|
||||
if let Some(update) = $commitment_update {
|
||||
$channel_state.pending_msg_events.push(events::MessageSendEvent::UpdateHTLCs {
|
||||
node_id: counterparty_node_id,
|
||||
updates: update,
|
||||
});
|
||||
}
|
||||
} }
|
||||
macro_rules! handle_raa { () => {
|
||||
if let Some(revoke_and_ack) = $raa {
|
||||
$channel_state.pending_msg_events.push(events::MessageSendEvent::SendRevokeAndACK {
|
||||
node_id: counterparty_node_id,
|
||||
msg: revoke_and_ack,
|
||||
});
|
||||
}
|
||||
} }
|
||||
match $order {
|
||||
RAACommitmentOrder::CommitmentFirst => {
|
||||
handle_cs!();
|
||||
handle_raa!();
|
||||
},
|
||||
RAACommitmentOrder::RevokeAndACKFirst => {
|
||||
handle_raa!();
|
||||
handle_cs!();
|
||||
},
|
||||
}
|
||||
|
||||
let funding_broadcastable: Option<Transaction> = $funding_broadcastable; // Force type-checking to resolve
|
||||
if let Some(tx) = funding_broadcastable {
|
||||
log_info!($self.logger, "Broadcasting funding transaction with txid {}", tx.txid());
|
||||
$self.tx_broadcaster.broadcast_transaction(&tx);
|
||||
}
|
||||
break Ok(());
|
||||
};
|
||||
|
||||
(htlc_forwards, res, counterparty_node_id)
|
||||
} }
|
||||
}
|
||||
|
||||
macro_rules! post_handle_chan_restoration {
|
||||
($self: ident, $locked_res: expr) => { {
|
||||
let (htlc_forwards, res, counterparty_node_id) = $locked_res;
|
||||
($self: ident, $locked_res: expr, $counterparty_node_id: expr) => { {
|
||||
let (htlc_forwards, res) = $locked_res;
|
||||
|
||||
let _ = handle_error!($self, res, counterparty_node_id);
|
||||
let _ = handle_error!($self, res, *$counterparty_node_id);
|
||||
|
||||
if let Some(forwards) = htlc_forwards {
|
||||
$self.forward_htlcs(&mut [forwards][..]);
|
||||
|
@ -4439,6 +4374,72 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
|
|||
self.our_network_pubkey.clone()
|
||||
}
|
||||
|
||||
/// Handles a channel reentering a functional state, either due to reconnect or a monitor
|
||||
/// update completion.
|
||||
fn handle_channel_resumption(&self, pending_msg_events: &mut Vec<MessageSendEvent>,
|
||||
channel: &mut Channel<<K::Target as KeysInterface>::Signer>, raa: Option<msgs::RevokeAndACK>,
|
||||
commitment_update: Option<msgs::CommitmentUpdate>, order: RAACommitmentOrder,
|
||||
pending_forwards: Vec<(PendingHTLCInfo, u64)>, funding_broadcastable: Option<Transaction>,
|
||||
channel_ready: Option<msgs::ChannelReady>, announcement_sigs: Option<msgs::AnnouncementSignatures>)
|
||||
-> (Option<(u64, OutPoint, Vec<(PendingHTLCInfo, u64)>)>, Result<(), MsgHandleErrInternal>) {
|
||||
let mut htlc_forwards = None;
|
||||
|
||||
let counterparty_node_id = channel.get_counterparty_node_id();
|
||||
let res = loop {
|
||||
if !pending_forwards.is_empty() {
|
||||
htlc_forwards = Some((channel.get_short_channel_id().unwrap_or(channel.outbound_scid_alias()),
|
||||
channel.get_funding_txo().unwrap(), pending_forwards));
|
||||
}
|
||||
|
||||
if let Some(msg) = channel_ready {
|
||||
send_channel_ready!(self, pending_msg_events, channel, msg);
|
||||
}
|
||||
if let Some(msg) = announcement_sigs {
|
||||
pending_msg_events.push(events::MessageSendEvent::SendAnnouncementSignatures {
|
||||
node_id: counterparty_node_id,
|
||||
msg,
|
||||
});
|
||||
}
|
||||
|
||||
emit_channel_ready_event!(self, channel);
|
||||
|
||||
macro_rules! handle_cs { () => {
|
||||
if let Some(update) = commitment_update {
|
||||
pending_msg_events.push(events::MessageSendEvent::UpdateHTLCs {
|
||||
node_id: counterparty_node_id,
|
||||
updates: update,
|
||||
});
|
||||
}
|
||||
} }
|
||||
macro_rules! handle_raa { () => {
|
||||
if let Some(revoke_and_ack) = raa {
|
||||
pending_msg_events.push(events::MessageSendEvent::SendRevokeAndACK {
|
||||
node_id: counterparty_node_id,
|
||||
msg: revoke_and_ack,
|
||||
});
|
||||
}
|
||||
} }
|
||||
match order {
|
||||
RAACommitmentOrder::CommitmentFirst => {
|
||||
handle_cs!();
|
||||
handle_raa!();
|
||||
},
|
||||
RAACommitmentOrder::RevokeAndACKFirst => {
|
||||
handle_raa!();
|
||||
handle_cs!();
|
||||
},
|
||||
}
|
||||
|
||||
if let Some(tx) = funding_broadcastable {
|
||||
log_info!(self.logger, "Broadcasting funding transaction with txid {}", tx.txid());
|
||||
self.tx_broadcaster.broadcast_transaction(&tx);
|
||||
}
|
||||
break Ok(());
|
||||
};
|
||||
|
||||
(htlc_forwards, res)
|
||||
}
|
||||
|
||||
fn channel_monitor_updated(&self, funding_txo: &OutPoint, highest_applied_update_id: u64) {
|
||||
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
|
||||
|
||||
|
@ -4469,14 +4470,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
|
|||
})
|
||||
} else { None }
|
||||
} else { None };
|
||||
chan_restoration_res = handle_chan_restoration_locked!(self, channel_state, channel, updates.raa, updates.commitment_update, updates.order, updates.accepted_htlcs, updates.funding_broadcastable, updates.channel_ready, updates.announcement_sigs);
|
||||
chan_restoration_res = self.handle_channel_resumption(&mut channel_state.pending_msg_events, channel.get_mut(), updates.raa, updates.commitment_update, updates.order, updates.accepted_htlcs, updates.funding_broadcastable, updates.channel_ready, updates.announcement_sigs);
|
||||
if let Some(upd) = channel_update {
|
||||
channel_state.pending_msg_events.push(upd);
|
||||
}
|
||||
|
||||
(updates.failed_htlcs, updates.finalized_claimed_htlcs, counterparty_node_id)
|
||||
};
|
||||
post_handle_chan_restoration!(self, chan_restoration_res);
|
||||
post_handle_chan_restoration!(self, chan_restoration_res, &counterparty_node_id);
|
||||
self.finalize_claims(finalized_claims);
|
||||
for failure in pending_failures.drain(..) {
|
||||
let receiver = HTLCDestination::NextHopChannel { node_id: Some(counterparty_node_id), channel_id: funding_txo.to_channel_id() };
|
||||
|
@ -5262,8 +5263,8 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
|
|||
}
|
||||
}
|
||||
let need_lnd_workaround = chan.get_mut().workaround_lnd_bug_4006.take();
|
||||
chan_restoration_res = handle_chan_restoration_locked!(
|
||||
self, channel_state, chan, responses.raa, responses.commitment_update, responses.order,
|
||||
chan_restoration_res = self.handle_channel_resumption(
|
||||
&mut channel_state.pending_msg_events, chan.get_mut(), responses.raa, responses.commitment_update, responses.order,
|
||||
Vec::new(), None, responses.channel_ready, responses.announcement_sigs);
|
||||
if let Some(upd) = channel_update {
|
||||
channel_state.pending_msg_events.push(upd);
|
||||
|
@ -5273,7 +5274,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
|
|||
hash_map::Entry::Vacant(_) => return Err(MsgHandleErrInternal::send_err_msg_no_close("Failed to find corresponding channel".to_owned(), msg.channel_id))
|
||||
}
|
||||
};
|
||||
post_handle_chan_restoration!(self, chan_restoration_res);
|
||||
post_handle_chan_restoration!(self, chan_restoration_res, counterparty_node_id);
|
||||
|
||||
if let Some(channel_ready_msg) = need_lnd_workaround {
|
||||
self.internal_channel_ready(counterparty_node_id, &channel_ready_msg)?;
|
||||
|
|
Loading…
Add table
Reference in a new issue