Skip to content

Commit b852df5

Browse files
Remove redundant hashmap lookups
Avoid doing the same hashmap lookups twice in a row, when it's not needed. Refactor `claim_funds_from_hop` in order to enable this change.
1 parent 1a5482a commit b852df5

File tree

1 file changed

+65
-72
lines changed

1 file changed

+65
-72
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 65 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -3859,13 +3859,13 @@ where
38593859
}
38603860
};
38613861

3862-
if let None = per_peer_state.get(&counterparty_node_id) {
3862+
let peer_state_mutex_opt = per_peer_state.get(&counterparty_node_id);
3863+
if let None = peer_state_mutex_opt {
38633864
valid_mpp = false;
38643865
break;
38653866
}
38663867

3867-
let peer_state_mutex = per_peer_state.get(&counterparty_node_id).unwrap();
3868-
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
3868+
let mut peer_state_lock = peer_state_mutex_opt.unwrap().lock().unwrap();
38693869
let peer_state = &mut *peer_state_lock;
38703870

38713871
if let None = peer_state.channel_by_id.get(&chan_id) {
@@ -3952,83 +3952,76 @@ where
39523952
None => None
39533953
};
39543954

3955-
let (found_channel, mut peer_state_opt) = if counterparty_node_id_opt.is_some() && per_peer_state.get(&counterparty_node_id_opt.unwrap()).is_some() {
3956-
let peer_mutex = per_peer_state.get(&counterparty_node_id_opt.unwrap()).unwrap();
3957-
let peer_state = peer_mutex.lock().unwrap();
3958-
let found_channel = peer_state.channel_by_id.contains_key(&chan_id);
3959-
(found_channel, Some(peer_state))
3960-
} else { (false, None) };
3961-
3962-
if found_channel {
3963-
let peer_state = &mut *peer_state_opt.as_mut().unwrap();
3964-
if let hash_map::Entry::Occupied(mut chan) = peer_state.channel_by_id.entry(chan_id) {
3965-
let counterparty_node_id = chan.get().get_counterparty_node_id();
3966-
match chan.get_mut().get_update_fulfill_htlc_and_commit(prev_hop.htlc_id, payment_preimage, &self.logger) {
3967-
Ok(msgs_monitor_option) => {
3968-
if let UpdateFulfillCommitFetch::NewClaim { msgs, htlc_value_msat, monitor_update } = msgs_monitor_option {
3969-
match self.chain_monitor.update_channel(chan.get().get_funding_txo().unwrap(), &monitor_update) {
3970-
ChannelMonitorUpdateStatus::Completed => {},
3971-
e => {
3972-
log_given_level!(self.logger, if e == ChannelMonitorUpdateStatus::PermanentFailure { Level::Error } else { Level::Debug },
3973-
"Failed to update channel monitor with preimage {:?}: {:?}",
3974-
payment_preimage, e);
3975-
let err = handle_monitor_update_res!(self, e, chan, RAACommitmentOrder::CommitmentFirst, false, msgs.is_some()).unwrap_err();
3976-
mem::drop(peer_state_opt);
3977-
mem::drop(per_peer_state);
3978-
self.handle_monitor_update_completion_actions(completion_action(Some(htlc_value_msat)));
3979-
return Err((counterparty_node_id, err));
3980-
}
3981-
}
3982-
if let Some((msg, commitment_signed)) = msgs {
3983-
log_debug!(self.logger, "Claiming funds for HTLC with preimage {} resulted in a commitment_signed for channel {}",
3984-
log_bytes!(payment_preimage.0), log_bytes!(chan.get().channel_id()));
3985-
peer_state.pending_msg_events.push(events::MessageSendEvent::UpdateHTLCs {
3986-
node_id: counterparty_node_id,
3987-
updates: msgs::CommitmentUpdate {
3988-
update_add_htlcs: Vec::new(),
3989-
update_fulfill_htlcs: vec![msg],
3990-
update_fail_htlcs: Vec::new(),
3991-
update_fail_malformed_htlcs: Vec::new(),
3992-
update_fee: None,
3993-
commitment_signed,
3994-
}
3995-
});
3996-
}
3997-
mem::drop(peer_state_opt);
3998-
mem::drop(per_peer_state);
3999-
self.handle_monitor_update_completion_actions(completion_action(Some(htlc_value_msat)));
4000-
Ok(())
4001-
} else {
4002-
Ok(())
4003-
}
4004-
},
4005-
Err((e, monitor_update)) => {
3955+
let mut peer_state_opt = counterparty_node_id_opt.as_ref().map(
3956+
|counterparty_node_id| per_peer_state.get(counterparty_node_id).map(
3957+
|peer_mutex| peer_mutex.lock().unwrap()
3958+
)
3959+
).unwrap_or(None);
3960+
3961+
if let Some(hash_map::Entry::Occupied(mut chan)) = peer_state_opt.as_mut().map(|peer_state| peer_state.channel_by_id.entry(chan_id))
3962+
{
3963+
let counterparty_node_id = chan.get().get_counterparty_node_id();
3964+
match chan.get_mut().get_update_fulfill_htlc_and_commit(prev_hop.htlc_id, payment_preimage, &self.logger) {
3965+
Ok(msgs_monitor_option) => {
3966+
if let UpdateFulfillCommitFetch::NewClaim { msgs, htlc_value_msat, monitor_update } = msgs_monitor_option {
40063967
match self.chain_monitor.update_channel(chan.get().get_funding_txo().unwrap(), &monitor_update) {
40073968
ChannelMonitorUpdateStatus::Completed => {},
40083969
e => {
4009-
// TODO: This needs to be handled somehow - if we receive a monitor update
4010-
// with a preimage we *must* somehow manage to propagate it to the upstream
4011-
// channel, or we must have an ability to receive the same update and try
4012-
// again on restart.
4013-
log_given_level!(self.logger, if e == ChannelMonitorUpdateStatus::PermanentFailure { Level::Error } else { Level::Info },
4014-
"Failed to update channel monitor with preimage {:?} immediately prior to force-close: {:?}",
3970+
log_given_level!(self.logger, if e == ChannelMonitorUpdateStatus::PermanentFailure { Level::Error } else { Level::Debug },
3971+
"Failed to update channel monitor with preimage {:?}: {:?}",
40153972
payment_preimage, e);
4016-
},
3973+
let err = handle_monitor_update_res!(self, e, chan, RAACommitmentOrder::CommitmentFirst, false, msgs.is_some()).unwrap_err();
3974+
mem::drop(peer_state_opt);
3975+
mem::drop(per_peer_state);
3976+
self.handle_monitor_update_completion_actions(completion_action(Some(htlc_value_msat)));
3977+
return Err((counterparty_node_id, err));
3978+
}
40173979
}
4018-
let (drop, res) = convert_chan_err!(self, e, chan.get_mut(), &chan_id);
4019-
if drop {
4020-
chan.remove_entry();
3980+
if let Some((msg, commitment_signed)) = msgs {
3981+
log_debug!(self.logger, "Claiming funds for HTLC with preimage {} resulted in a commitment_signed for channel {}",
3982+
log_bytes!(payment_preimage.0), log_bytes!(chan.get().channel_id()));
3983+
peer_state_opt.as_mut().unwrap().pending_msg_events.push(events::MessageSendEvent::UpdateHTLCs {
3984+
node_id: counterparty_node_id,
3985+
updates: msgs::CommitmentUpdate {
3986+
update_add_htlcs: Vec::new(),
3987+
update_fulfill_htlcs: vec![msg],
3988+
update_fail_htlcs: Vec::new(),
3989+
update_fail_malformed_htlcs: Vec::new(),
3990+
update_fee: None,
3991+
commitment_signed,
3992+
}
3993+
});
40213994
}
40223995
mem::drop(peer_state_opt);
40233996
mem::drop(per_peer_state);
4024-
self.handle_monitor_update_completion_actions(completion_action(None));
4025-
Err((counterparty_node_id, res))
4026-
},
4027-
}
4028-
} else {
4029-
// We've held the peer_state mutex since finding the channel and setting
4030-
// found_channel to true, so the channel can't have been dropped.
4031-
unreachable!()
3997+
self.handle_monitor_update_completion_actions(completion_action(Some(htlc_value_msat)));
3998+
Ok(())
3999+
} else {
4000+
Ok(())
4001+
}
4002+
},
4003+
Err((e, monitor_update)) => {
4004+
match self.chain_monitor.update_channel(chan.get().get_funding_txo().unwrap(), &monitor_update) {
4005+
ChannelMonitorUpdateStatus::Completed => {},
4006+
e => {
4007+
// TODO: This needs to be handled somehow - if we receive a monitor update
4008+
// with a preimage we *must* somehow manage to propagate it to the upstream
4009+
// channel, or we must have an ability to receive the same update and try
4010+
// again on restart.
4011+
log_given_level!(self.logger, if e == ChannelMonitorUpdateStatus::PermanentFailure { Level::Error } else { Level::Info },
4012+
"Failed to update channel monitor with preimage {:?} immediately prior to force-close: {:?}",
4013+
payment_preimage, e);
4014+
},
4015+
}
4016+
let (drop, res) = convert_chan_err!(self, e, chan.get_mut(), &chan_id);
4017+
if drop {
4018+
chan.remove_entry();
4019+
}
4020+
mem::drop(peer_state_opt);
4021+
mem::drop(per_peer_state);
4022+
self.handle_monitor_update_completion_actions(completion_action(None));
4023+
Err((counterparty_node_id, res))
4024+
},
40324025
}
40334026
} else {
40344027
let preimage_update = ChannelMonitorUpdate {

0 commit comments

Comments
 (0)