Skip to content

Commit 1630bc2

Browse files
Cleanup ChannelManager::write lockorder
1 parent 6772609 commit 1630bc2

File tree

1 file changed

+28
-36
lines changed

1 file changed

+28
-36
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6600,46 +6600,44 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Writeable f
66006600
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
66016601
let _consistency_lock = self.total_consistency_lock.write().unwrap();
66026602

6603+
let forward_htlcs = self.forward_htlcs.lock().unwrap();
6604+
let channel_state = self.channel_state.lock().unwrap();
6605+
let per_peer_state = self.per_peer_state.write().unwrap();
6606+
let peer_states = per_peer_state.iter().map(|(peer_pubkey, peer_state_mutex)| (peer_pubkey, peer_state_mutex.lock().unwrap())).collect::<Vec<(&PublicKey, MutexGuard<'_, PeerState>)>>();
6607+
let pending_inbound_payments = self.pending_inbound_payments.lock().unwrap();
6608+
let pending_outbound_payments = self.pending_outbound_payments.lock().unwrap();
6609+
let best_block = self.best_block.write().unwrap();
6610+
let events = self.pending_events.lock().unwrap();
6611+
let background_events = self.pending_background_events.lock().unwrap();
6612+
66036613
write_ver_prefix!(writer, SERIALIZATION_VERSION, MIN_SERIALIZATION_VERSION);
66046614

66056615
self.genesis_hash.write(writer)?;
6606-
{
6607-
let best_block = self.best_block.read().unwrap();
6608-
best_block.height().write(writer)?;
6609-
best_block.block_hash().write(writer)?;
6610-
}
6616+
best_block.height().write(writer)?;
6617+
best_block.block_hash().write(writer)?;
66116618

6612-
{
6613-
// Take `channel_state` lock temporarily to avoid creating a lock order that requires
6614-
// that the `forward_htlcs` lock is taken after `channel_state`
6615-
let channel_state = self.channel_state.lock().unwrap();
6616-
let mut unfunded_channels = 0;
6617-
for (_, channel) in channel_state.by_id.iter() {
6618-
if !channel.is_funding_initiated() {
6619-
unfunded_channels += 1;
6620-
}
6619+
let mut unfunded_channels = 0;
6620+
for (_, channel) in channel_state.by_id.iter() {
6621+
if !channel.is_funding_initiated() {
6622+
unfunded_channels += 1;
66216623
}
6622-
((channel_state.by_id.len() - unfunded_channels) as u64).write(writer)?;
6623-
for (_, channel) in channel_state.by_id.iter() {
6624-
if channel.is_funding_initiated() {
6625-
channel.write(writer)?;
6626-
}
6624+
}
6625+
((channel_state.by_id.len() - unfunded_channels) as u64).write(writer)?;
6626+
for (_, channel) in channel_state.by_id.iter() {
6627+
if channel.is_funding_initiated() {
6628+
channel.write(writer)?;
66276629
}
66286630
}
66296631

6630-
{
6631-
let forward_htlcs = self.forward_htlcs.lock().unwrap();
6632-
(forward_htlcs.len() as u64).write(writer)?;
6633-
for (short_channel_id, pending_forwards) in forward_htlcs.iter() {
6634-
short_channel_id.write(writer)?;
6635-
(pending_forwards.len() as u64).write(writer)?;
6636-
for forward in pending_forwards {
6637-
forward.write(writer)?;
6638-
}
6632+
(forward_htlcs.len() as u64).write(writer)?;
6633+
for (short_channel_id, pending_forwards) in forward_htlcs.iter() {
6634+
short_channel_id.write(writer)?;
6635+
(pending_forwards.len() as u64).write(writer)?;
6636+
for forward in pending_forwards {
6637+
forward.write(writer)?;
66396638
}
66406639
}
66416640

6642-
let channel_state = self.channel_state.lock().unwrap();
66436641
let mut htlc_purposes: Vec<&events::PaymentPurpose> = Vec::new();
66446642
(channel_state.claimable_htlcs.len() as u64).write(writer)?;
66456643
for (payment_hash, (purpose, previous_hops)) in channel_state.claimable_htlcs.iter() {
@@ -6651,23 +6649,17 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Writeable f
66516649
htlc_purposes.push(purpose);
66526650
}
66536651

6654-
let per_peer_state = self.per_peer_state.write().unwrap();
66556652
(per_peer_state.len() as u64).write(writer)?;
6656-
for (peer_pubkey, peer_state_mutex) in per_peer_state.iter() {
6653+
for (peer_pubkey, peer_state) in peer_states.iter() {
66576654
peer_pubkey.write(writer)?;
6658-
let peer_state = peer_state_mutex.lock().unwrap();
66596655
peer_state.latest_features.write(writer)?;
66606656
}
66616657

6662-
let pending_inbound_payments = self.pending_inbound_payments.lock().unwrap();
6663-
let pending_outbound_payments = self.pending_outbound_payments.lock().unwrap();
6664-
let events = self.pending_events.lock().unwrap();
66656658
(events.len() as u64).write(writer)?;
66666659
for event in events.iter() {
66676660
event.write(writer)?;
66686661
}
66696662

6670-
let background_events = self.pending_background_events.lock().unwrap();
66716663
(background_events.len() as u64).write(writer)?;
66726664
for event in background_events.iter() {
66736665
match event {

0 commit comments

Comments
 (0)