Skip to content

Commit 3379f8c

Browse files
Remove forward_htlc after channel_state lock order
The `forward_htlc` was prior to this commit only held at the same time as the `channel_state` lock during the write process of the `ChannelManager`. This commit removes the lock order dependency, by taking the `channel_state`lock temporarily during the write process.
1 parent e8854a9 commit 3379f8c

File tree

1 file changed

+24
-17
lines changed

1 file changed

+24
-17
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6548,30 +6548,37 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Writeable f
65486548
best_block.block_hash().write(writer)?;
65496549
}
65506550

6551-
let channel_state = self.channel_state.lock().unwrap();
6552-
let mut unfunded_channels = 0;
6553-
for (_, channel) in channel_state.by_id.iter() {
6554-
if !channel.is_funding_initiated() {
6555-
unfunded_channels += 1;
6551+
{
6552+
// Take `channel_state` lock temporarily to avoid creating a lock order that requires
6553+
// that the `forward_htlcs` lock is taken after `channel_state`
6554+
let channel_state = self.channel_state.lock().unwrap();
6555+
let mut unfunded_channels = 0;
6556+
for (_, channel) in channel_state.by_id.iter() {
6557+
if !channel.is_funding_initiated() {
6558+
unfunded_channels += 1;
6559+
}
65566560
}
6557-
}
6558-
((channel_state.by_id.len() - unfunded_channels) as u64).write(writer)?;
6559-
for (_, channel) in channel_state.by_id.iter() {
6560-
if channel.is_funding_initiated() {
6561-
channel.write(writer)?;
6561+
((channel_state.by_id.len() - unfunded_channels) as u64).write(writer)?;
6562+
for (_, channel) in channel_state.by_id.iter() {
6563+
if channel.is_funding_initiated() {
6564+
channel.write(writer)?;
6565+
}
65626566
}
65636567
}
65646568

6565-
let forward_htlcs = self.forward_htlcs.lock().unwrap();
6566-
(forward_htlcs.len() as u64).write(writer)?;
6567-
for (short_channel_id, pending_forwards) in forward_htlcs.iter() {
6568-
short_channel_id.write(writer)?;
6569-
(pending_forwards.len() as u64).write(writer)?;
6570-
for forward in pending_forwards {
6571-
forward.write(writer)?;
6569+
{
6570+
let forward_htlcs = self.forward_htlcs.lock().unwrap();
6571+
(forward_htlcs.len() as u64).write(writer)?;
6572+
for (short_channel_id, pending_forwards) in forward_htlcs.iter() {
6573+
short_channel_id.write(writer)?;
6574+
(pending_forwards.len() as u64).write(writer)?;
6575+
for forward in pending_forwards {
6576+
forward.write(writer)?;
6577+
}
65726578
}
65736579
}
65746580

6581+
let channel_state = self.channel_state.lock().unwrap();
65756582
let mut htlc_purposes: Vec<&events::PaymentPurpose> = Vec::new();
65766583
(channel_state.claimable_htlcs.len() as u64).write(writer)?;
65776584
for (payment_hash, (purpose, previous_hops)) in channel_state.claimable_htlcs.iter() {

0 commit comments

Comments
 (0)