Skip to content

Commit f1c6cd8

Browse files
committed
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.
1 parent 7e9b88a commit f1c6cd8

File tree

1 file changed

+74
-73
lines changed

1 file changed

+74
-73
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 74 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1517,76 +1517,11 @@ macro_rules! emit_channel_ready_event {
15171517
}
15181518
}
15191519

1520-
macro_rules! handle_chan_restoration_locked {
1521-
($self: ident, $channel_state: expr, $channel_entry: expr,
1522-
$raa: expr, $commitment_update: expr, $order: expr,
1523-
$pending_forwards: expr, $funding_broadcastable: expr, $channel_ready: expr, $announcement_sigs: expr) => { {
1524-
let mut htlc_forwards = None;
1525-
1526-
let counterparty_node_id = $channel_entry.get().get_counterparty_node_id();
1527-
let res = loop {
1528-
let forwards: Vec<(PendingHTLCInfo, u64)> = $pending_forwards; // Force type-checking to resolve
1529-
if !forwards.is_empty() {
1530-
htlc_forwards = Some(($channel_entry.get().get_short_channel_id().unwrap_or($channel_entry.get().outbound_scid_alias()),
1531-
$channel_entry.get().get_funding_txo().unwrap(), forwards));
1532-
}
1533-
1534-
if let Some(msg) = $channel_ready {
1535-
send_channel_ready!($self, $channel_state.pending_msg_events, $channel_entry.get(), msg);
1536-
}
1537-
if let Some(msg) = $announcement_sigs {
1538-
$channel_state.pending_msg_events.push(events::MessageSendEvent::SendAnnouncementSignatures {
1539-
node_id: counterparty_node_id,
1540-
msg,
1541-
});
1542-
}
1543-
1544-
emit_channel_ready_event!($self, $channel_entry.get_mut());
1545-
1546-
macro_rules! handle_cs { () => {
1547-
if let Some(update) = $commitment_update {
1548-
$channel_state.pending_msg_events.push(events::MessageSendEvent::UpdateHTLCs {
1549-
node_id: counterparty_node_id,
1550-
updates: update,
1551-
});
1552-
}
1553-
} }
1554-
macro_rules! handle_raa { () => {
1555-
if let Some(revoke_and_ack) = $raa {
1556-
$channel_state.pending_msg_events.push(events::MessageSendEvent::SendRevokeAndACK {
1557-
node_id: counterparty_node_id,
1558-
msg: revoke_and_ack,
1559-
});
1560-
}
1561-
} }
1562-
match $order {
1563-
RAACommitmentOrder::CommitmentFirst => {
1564-
handle_cs!();
1565-
handle_raa!();
1566-
},
1567-
RAACommitmentOrder::RevokeAndACKFirst => {
1568-
handle_raa!();
1569-
handle_cs!();
1570-
},
1571-
}
1572-
1573-
let funding_broadcastable: Option<Transaction> = $funding_broadcastable; // Force type-checking to resolve
1574-
if let Some(tx) = funding_broadcastable {
1575-
log_info!($self.logger, "Broadcasting funding transaction with txid {}", tx.txid());
1576-
$self.tx_broadcaster.broadcast_transaction(&tx);
1577-
}
1578-
break Ok(());
1579-
};
1580-
1581-
(htlc_forwards, res, counterparty_node_id)
1582-
} }
1583-
}
1584-
15851520
macro_rules! post_handle_chan_restoration {
1586-
($self: ident, $locked_res: expr) => { {
1587-
let (htlc_forwards, res, counterparty_node_id) = $locked_res;
1521+
($self: ident, $locked_res: expr, $counterparty_node_id: expr) => { {
1522+
let (htlc_forwards, res) = $locked_res;
15881523

1589-
let _ = handle_error!($self, res, counterparty_node_id);
1524+
let _ = handle_error!($self, res, *$counterparty_node_id);
15901525

15911526
if let Some(forwards) = htlc_forwards {
15921527
$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
44394374
self.our_network_pubkey.clone()
44404375
}
44414376

4377+
/// Handles a channel reentering a functional state, either due to reconnect or a monitor
4378+
/// update completion.
4379+
fn handle_channel_resumption(&self, pending_msg_events: &mut Vec<MessageSendEvent>,
4380+
channel: &mut Channel<<K::Target as KeysInterface>::Signer>, raa: Option<msgs::RevokeAndACK>,
4381+
commitment_update: Option<msgs::CommitmentUpdate>, order: RAACommitmentOrder,
4382+
pending_forwards: Vec<(PendingHTLCInfo, u64)>, funding_broadcastable: Option<Transaction>,
4383+
channel_ready: Option<msgs::ChannelReady>, announcement_sigs: Option<msgs::AnnouncementSignatures>)
4384+
-> (Option<(u64, OutPoint, Vec<(PendingHTLCInfo, u64)>)>, Result<(), MsgHandleErrInternal>) {
4385+
let mut htlc_forwards = None;
4386+
4387+
let counterparty_node_id = channel.get_counterparty_node_id();
4388+
let res = loop {
4389+
if !pending_forwards.is_empty() {
4390+
htlc_forwards = Some((channel.get_short_channel_id().unwrap_or(channel.outbound_scid_alias()),
4391+
channel.get_funding_txo().unwrap(), pending_forwards));
4392+
}
4393+
4394+
if let Some(msg) = channel_ready {
4395+
send_channel_ready!(self, pending_msg_events, channel, msg);
4396+
}
4397+
if let Some(msg) = announcement_sigs {
4398+
pending_msg_events.push(events::MessageSendEvent::SendAnnouncementSignatures {
4399+
node_id: counterparty_node_id,
4400+
msg,
4401+
});
4402+
}
4403+
4404+
emit_channel_ready_event!(self, channel);
4405+
4406+
macro_rules! handle_cs { () => {
4407+
if let Some(update) = commitment_update {
4408+
pending_msg_events.push(events::MessageSendEvent::UpdateHTLCs {
4409+
node_id: counterparty_node_id,
4410+
updates: update,
4411+
});
4412+
}
4413+
} }
4414+
macro_rules! handle_raa { () => {
4415+
if let Some(revoke_and_ack) = raa {
4416+
pending_msg_events.push(events::MessageSendEvent::SendRevokeAndACK {
4417+
node_id: counterparty_node_id,
4418+
msg: revoke_and_ack,
4419+
});
4420+
}
4421+
} }
4422+
match order {
4423+
RAACommitmentOrder::CommitmentFirst => {
4424+
handle_cs!();
4425+
handle_raa!();
4426+
},
4427+
RAACommitmentOrder::RevokeAndACKFirst => {
4428+
handle_raa!();
4429+
handle_cs!();
4430+
},
4431+
}
4432+
4433+
if let Some(tx) = funding_broadcastable {
4434+
log_info!(self.logger, "Broadcasting funding transaction with txid {}", tx.txid());
4435+
self.tx_broadcaster.broadcast_transaction(&tx);
4436+
}
4437+
break Ok(());
4438+
};
4439+
4440+
(htlc_forwards, res)
4441+
}
4442+
44424443
fn channel_monitor_updated(&self, funding_txo: &OutPoint, highest_applied_update_id: u64) {
44434444
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
44444445

@@ -4469,14 +4470,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
44694470
})
44704471
} else { None }
44714472
} else { None };
4472-
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);
4473+
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);
44734474
if let Some(upd) = channel_update {
44744475
channel_state.pending_msg_events.push(upd);
44754476
}
44764477

44774478
(updates.failed_htlcs, updates.finalized_claimed_htlcs, counterparty_node_id)
44784479
};
4479-
post_handle_chan_restoration!(self, chan_restoration_res);
4480+
post_handle_chan_restoration!(self, chan_restoration_res, &counterparty_node_id);
44804481
self.finalize_claims(finalized_claims);
44814482
for failure in pending_failures.drain(..) {
44824483
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
52625263
}
52635264
}
52645265
let need_lnd_workaround = chan.get_mut().workaround_lnd_bug_4006.take();
5265-
chan_restoration_res = handle_chan_restoration_locked!(
5266-
self, channel_state, chan, responses.raa, responses.commitment_update, responses.order,
5266+
chan_restoration_res = self.handle_channel_resumption(
5267+
&mut channel_state.pending_msg_events, chan.get_mut(), responses.raa, responses.commitment_update, responses.order,
52675268
Vec::new(), None, responses.channel_ready, responses.announcement_sigs);
52685269
if let Some(upd) = channel_update {
52695270
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
52735274
hash_map::Entry::Vacant(_) => return Err(MsgHandleErrInternal::send_err_msg_no_close("Failed to find corresponding channel".to_owned(), msg.channel_id))
52745275
}
52755276
};
5276-
post_handle_chan_restoration!(self, chan_restoration_res);
5277+
post_handle_chan_restoration!(self, chan_restoration_res, counterparty_node_id);
52775278

52785279
if let Some(channel_ready_msg) = need_lnd_workaround {
52795280
self.internal_channel_ready(counterparty_node_id, &channel_ready_msg)?;

0 commit comments

Comments
 (0)