Skip to content

Commit 4af18a6

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 0ceb5be commit 4af18a6

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
@@ -6677,30 +6677,37 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Writeable f
66776677
best_block.block_hash().write(writer)?;
66786678
}
66796679

6680-
let channel_state = self.channel_state.lock().unwrap();
6681-
let mut unfunded_channels = 0;
6682-
for (_, channel) in channel_state.by_id.iter() {
6683-
if !channel.is_funding_initiated() {
6684-
unfunded_channels += 1;
6680+
{
6681+
// Take `channel_state` lock temporarily to avoid creating a lock order that requires
6682+
// that the `forward_htlcs` lock is taken after `channel_state`
6683+
let channel_state = self.channel_state.lock().unwrap();
6684+
let mut unfunded_channels = 0;
6685+
for (_, channel) in channel_state.by_id.iter() {
6686+
if !channel.is_funding_initiated() {
6687+
unfunded_channels += 1;
6688+
}
66856689
}
6686-
}
6687-
((channel_state.by_id.len() - unfunded_channels) as u64).write(writer)?;
6688-
for (_, channel) in channel_state.by_id.iter() {
6689-
if channel.is_funding_initiated() {
6690-
channel.write(writer)?;
6690+
((channel_state.by_id.len() - unfunded_channels) as u64).write(writer)?;
6691+
for (_, channel) in channel_state.by_id.iter() {
6692+
if channel.is_funding_initiated() {
6693+
channel.write(writer)?;
6694+
}
66916695
}
66926696
}
66936697

6694-
let forward_htlcs = self.forward_htlcs.lock().unwrap();
6695-
(forward_htlcs.len() as u64).write(writer)?;
6696-
for (short_channel_id, pending_forwards) in forward_htlcs.iter() {
6697-
short_channel_id.write(writer)?;
6698-
(pending_forwards.len() as u64).write(writer)?;
6699-
for forward in pending_forwards {
6700-
forward.write(writer)?;
6698+
{
6699+
let forward_htlcs = self.forward_htlcs.lock().unwrap();
6700+
(forward_htlcs.len() as u64).write(writer)?;
6701+
for (short_channel_id, pending_forwards) in forward_htlcs.iter() {
6702+
short_channel_id.write(writer)?;
6703+
(pending_forwards.len() as u64).write(writer)?;
6704+
for forward in pending_forwards {
6705+
forward.write(writer)?;
6706+
}
67016707
}
67026708
}
67036709

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

0 commit comments

Comments
 (0)