Skip to content

Commit f1ae10b

Browse files
committed
Hold PeerState in an RwLock rather than a Mutex
Previously, we would hold the `PeerState` in a `Mutex`, which disallows concurrent read-only operations. Here we switch to an `RwLock` making this possible.
1 parent 1d9e541 commit f1ae10b

File tree

6 files changed

+178
-178
lines changed

6 files changed

+178
-178
lines changed

lightning/src/ln/channelmanager.rs

+148-148
Large diffs are not rendered by default.

lightning/src/ln/functional_test_utils.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ impl<'a, 'b, 'c> Node<'a, 'b, 'c> {
491491
log_debug!(self.logger, "Setting channel signer for {} as available={}", chan_id, available);
492492

493493
let per_peer_state = self.node.per_peer_state.read().unwrap();
494-
let chan_lock = per_peer_state.get(peer_id).unwrap().lock().unwrap();
494+
let chan_lock = per_peer_state.get(peer_id).unwrap().write().unwrap();
495495

496496
let mut channel_keys_id = None;
497497
if let Some(chan) = chan_lock.channel_by_id.get(chan_id).map(|phase| phase.context()) {
@@ -930,7 +930,7 @@ macro_rules! get_channel_ref {
930930
($node: expr, $counterparty_node: expr, $per_peer_state_lock: ident, $peer_state_lock: ident, $channel_id: expr) => {
931931
{
932932
$per_peer_state_lock = $node.node.per_peer_state.read().unwrap();
933-
$peer_state_lock = $per_peer_state_lock.get(&$counterparty_node.node.get_our_node_id()).unwrap().lock().unwrap();
933+
$peer_state_lock = $per_peer_state_lock.get(&$counterparty_node.node.get_our_node_id()).unwrap().write().unwrap();
934934
$peer_state_lock.channel_by_id.get_mut(&$channel_id).unwrap()
935935
}
936936
}
@@ -1556,8 +1556,8 @@ macro_rules! check_warn_msg {
15561556
/// Checks if at least one peer is connected.
15571557
fn is_any_peer_connected(node: &Node) -> bool {
15581558
let peer_state = node.node.per_peer_state.read().unwrap();
1559-
for (_, peer_mutex) in peer_state.iter() {
1560-
let peer = peer_mutex.lock().unwrap();
1559+
for (_, peer_rwlock) in peer_state.iter() {
1560+
let peer = peer_rwlock.read().unwrap();
15611561
if peer.is_connected { return true; }
15621562
}
15631563
false
@@ -2018,8 +2018,8 @@ pub fn do_commitment_signed_dance(node_a: &Node<'_, '_, '_>, node_b: &Node<'_, '
20182018

20192019
let node_a_per_peer_state = node_a.node.per_peer_state.read().unwrap();
20202020
let mut number_of_msg_events = 0;
2021-
for (cp_id, peer_state_mutex) in node_a_per_peer_state.iter() {
2022-
let peer_state = peer_state_mutex.lock().unwrap();
2021+
for (cp_id, peer_state) in node_a_per_peer_state.iter() {
2022+
let peer_state = peer_state.write().unwrap();
20232023
let cp_pending_msg_events = &peer_state.pending_msg_events;
20242024
number_of_msg_events += cp_pending_msg_events.len();
20252025
if cp_pending_msg_events.len() == 1 {
@@ -2853,7 +2853,7 @@ pub fn pass_claimed_payment_along_route<'a, 'b, 'c, 'd>(args: ClaimAlongRouteArg
28532853
let (base_fee, prop_fee) = {
28542854
let per_peer_state = $node.node.per_peer_state.read().unwrap();
28552855
let peer_state = per_peer_state.get(&$prev_node.node.get_our_node_id())
2856-
.unwrap().lock().unwrap();
2856+
.unwrap().write().unwrap();
28572857
let channel = peer_state.channel_by_id.get(&next_msgs.as_ref().unwrap().0.channel_id).unwrap();
28582858
if let Some(prev_config) = channel.context().prev_config() {
28592859
(prev_config.forwarding_fee_base_msat as u64,
@@ -3458,7 +3458,7 @@ pub fn get_announce_close_broadcast_events<'a, 'b, 'c>(nodes: &Vec<Node<'a, 'b,
34583458
macro_rules! get_channel_value_stat {
34593459
($node: expr, $counterparty_node: expr, $channel_id: expr) => {{
34603460
let peer_state_lock = $node.node.per_peer_state.read().unwrap();
3461-
let chan_lock = peer_state_lock.get(&$counterparty_node.node.get_our_node_id()).unwrap().lock().unwrap();
3461+
let chan_lock = peer_state_lock.get(&$counterparty_node.node.get_our_node_id()).unwrap().write().unwrap();
34623462
let chan = chan_lock.channel_by_id.get(&$channel_id).map(
34633463
|phase| if let ChannelPhase::Funded(chan) = phase { Some(chan) } else { None }
34643464
).flatten().unwrap();

lightning/src/ln/functional_tests.rs

+17-17
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ fn test_update_fee_that_funder_cannot_afford() {
699699
// needed to sign the new commitment tx and (2) sign the new commitment tx.
700700
let (local_revocation_basepoint, local_htlc_basepoint, local_funding) = {
701701
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
702-
let chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
702+
let chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
703703
let local_chan = chan_lock.channel_by_id.get(&chan.2).map(
704704
|phase| if let ChannelPhase::Funded(chan) = phase { Some(chan) } else { None }
705705
).flatten().unwrap();
@@ -710,7 +710,7 @@ fn test_update_fee_that_funder_cannot_afford() {
710710
};
711711
let (remote_delayed_payment_basepoint, remote_htlc_basepoint,remote_point, remote_funding) = {
712712
let per_peer_state = nodes[1].node.per_peer_state.read().unwrap();
713-
let chan_lock = per_peer_state.get(&nodes[0].node.get_our_node_id()).unwrap().lock().unwrap();
713+
let chan_lock = per_peer_state.get(&nodes[0].node.get_our_node_id()).unwrap().write().unwrap();
714714
let remote_chan = chan_lock.channel_by_id.get(&chan.2).map(
715715
|phase| if let ChannelPhase::Funded(chan) = phase { Some(chan) } else { None }
716716
).flatten().unwrap();
@@ -727,7 +727,7 @@ fn test_update_fee_that_funder_cannot_afford() {
727727

728728
let res = {
729729
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
730-
let local_chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
730+
let local_chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
731731
let local_chan = local_chan_lock.channel_by_id.get(&chan.2).map(
732732
|phase| if let ChannelPhase::Funded(chan) = phase { Some(chan) } else { None }
733733
).flatten().unwrap();
@@ -1429,7 +1429,7 @@ fn test_fee_spike_violation_fails_htlc() {
14291429
// needed to sign the new commitment tx and (2) sign the new commitment tx.
14301430
let (local_revocation_basepoint, local_htlc_basepoint, local_secret, next_local_point, local_funding) = {
14311431
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
1432-
let chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
1432+
let chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
14331433
let local_chan = chan_lock.channel_by_id.get(&chan.2).map(
14341434
|phase| if let ChannelPhase::Funded(chan) = phase { Some(chan) } else { None }
14351435
).flatten().unwrap();
@@ -1445,7 +1445,7 @@ fn test_fee_spike_violation_fails_htlc() {
14451445
};
14461446
let (remote_delayed_payment_basepoint, remote_htlc_basepoint, remote_point, remote_funding) = {
14471447
let per_peer_state = nodes[1].node.per_peer_state.read().unwrap();
1448-
let chan_lock = per_peer_state.get(&nodes[0].node.get_our_node_id()).unwrap().lock().unwrap();
1448+
let chan_lock = per_peer_state.get(&nodes[0].node.get_our_node_id()).unwrap().write().unwrap();
14491449
let remote_chan = chan_lock.channel_by_id.get(&chan.2).map(
14501450
|phase| if let ChannelPhase::Funded(chan) = phase { Some(chan) } else { None }
14511451
).flatten().unwrap();
@@ -1476,7 +1476,7 @@ fn test_fee_spike_violation_fails_htlc() {
14761476

14771477
let res = {
14781478
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
1479-
let local_chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
1479+
let local_chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
14801480
let local_chan = local_chan_lock.channel_by_id.get(&chan.2).map(
14811481
|phase| if let ChannelPhase::Funded(chan) = phase { Some(chan) } else { None }
14821482
).flatten().unwrap();
@@ -3236,7 +3236,7 @@ fn do_test_commitment_revoked_fail_backward_exhaustive(deliver_bs_raa: bool, use
32363236
// The dust limit applied to HTLC outputs considers the fee of the HTLC transaction as
32373237
// well, so HTLCs at exactly the dust limit will not be included in commitment txn.
32383238
nodes[2].node.per_peer_state.read().unwrap().get(&nodes[1].node.get_our_node_id())
3239-
.unwrap().lock().unwrap().channel_by_id.get(&chan_2.2).unwrap().context().holder_dust_limit_satoshis * 1000
3239+
.unwrap().write().unwrap().channel_by_id.get(&chan_2.2).unwrap().context().holder_dust_limit_satoshis * 1000
32403240
} else { 3000000 };
32413241

32423242
let (_, first_payment_hash, ..) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], value);
@@ -5209,7 +5209,7 @@ fn do_test_fail_backwards_unrevoked_remote_announce(deliver_last_raa: bool, anno
52095209
assert_eq!(get_local_commitment_txn!(nodes[3], chan_2_3.2)[0].output.len(), 2);
52105210

52115211
let ds_dust_limit = nodes[3].node.per_peer_state.read().unwrap().get(&nodes[2].node.get_our_node_id())
5212-
.unwrap().lock().unwrap().channel_by_id.get(&chan_2_3.2).unwrap().context().holder_dust_limit_satoshis;
5212+
.unwrap().write().unwrap().channel_by_id.get(&chan_2_3.2).unwrap().context().holder_dust_limit_satoshis;
52135213
// 0th HTLC:
52145214
let (_, payment_hash_1, ..) = route_payment(&nodes[0], &[&nodes[2], &nodes[3], &nodes[4]], ds_dust_limit*1000); // not added < dust limit + HTLC tx fee
52155215
// 1st HTLC:
@@ -6344,7 +6344,7 @@ fn test_update_add_htlc_bolt2_sender_exceed_max_htlc_num_and_htlc_id_increment()
63446344
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
63456345
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 0);
63466346
let max_accepted_htlcs = nodes[1].node.per_peer_state.read().unwrap().get(&nodes[0].node.get_our_node_id())
6347-
.unwrap().lock().unwrap().channel_by_id.get(&chan.2).unwrap().context().counterparty_max_accepted_htlcs as u64;
6347+
.unwrap().write().unwrap().channel_by_id.get(&chan.2).unwrap().context().counterparty_max_accepted_htlcs as u64;
63486348

63496349
// Fetch a route in advance as we will be unable to once we're unable to send.
63506350
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100000);
@@ -6415,7 +6415,7 @@ fn test_update_add_htlc_bolt2_receiver_check_amount_received_more_than_min() {
64156415
let htlc_minimum_msat: u64;
64166416
{
64176417
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
6418-
let chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
6418+
let chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
64196419
let channel = chan_lock.channel_by_id.get(&chan.2).unwrap();
64206420
htlc_minimum_msat = channel.context().get_holder_htlc_minimum_msat();
64216421
}
@@ -7021,7 +7021,7 @@ fn do_test_failure_delay_dust_htlc_local_commitment(announce_latest: bool) {
70217021
let chan =create_announced_chan_between_nodes(&nodes, 0, 1);
70227022

70237023
let bs_dust_limit = nodes[1].node.per_peer_state.read().unwrap().get(&nodes[0].node.get_our_node_id())
7024-
.unwrap().lock().unwrap().channel_by_id.get(&chan.2).unwrap().context().holder_dust_limit_satoshis;
7024+
.unwrap().write().unwrap().channel_by_id.get(&chan.2).unwrap().context().holder_dust_limit_satoshis;
70257025

70267026
// We route 2 dust-HTLCs between A and B
70277027
let (_, payment_hash_1, ..) = route_payment(&nodes[0], &[&nodes[1]], bs_dust_limit*1000);
@@ -7114,7 +7114,7 @@ fn do_test_sweep_outbound_htlc_failure_update(revoked: bool, local: bool) {
71147114
let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
71157115

71167116
let bs_dust_limit = nodes[1].node.per_peer_state.read().unwrap().get(&nodes[0].node.get_our_node_id())
7117-
.unwrap().lock().unwrap().channel_by_id.get(&chan.2).unwrap().context().holder_dust_limit_satoshis;
7117+
.unwrap().write().unwrap().channel_by_id.get(&chan.2).unwrap().context().holder_dust_limit_satoshis;
71187118

71197119
let (_payment_preimage_1, dust_hash, ..) = route_payment(&nodes[0], &[&nodes[1]], bs_dust_limit*1000);
71207120
let (_payment_preimage_2, non_dust_hash, ..) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
@@ -7796,7 +7796,7 @@ fn test_counterparty_raa_skip_no_crash() {
77967796
let next_per_commitment_point;
77977797
{
77987798
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
7799-
let mut guard = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
7799+
let mut guard = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
78007800
let keys = guard.channel_by_id.get_mut(&channel_id).map(
78017801
|phase| if let ChannelPhase::Funded(chan) = phase { Some(chan) } else { None }
78027802
).flatten().unwrap().get_signer();
@@ -9227,7 +9227,7 @@ fn test_duplicate_chan_id() {
92279227

92289228
let funding_created = {
92299229
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
9230-
let mut a_peer_state = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
9230+
let mut a_peer_state = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
92319231
// Once we call `get_funding_created` the channel has a duplicate channel_id as
92329232
// another channel in the ChannelManager - an invalid state. Thus, we'd panic later when we
92339233
// try to create another channel. Instead, we drop the channel entirely here (leaving the
@@ -9942,7 +9942,7 @@ fn do_test_max_dust_htlc_exposure(dust_outbound_balance: bool, exposure_breach_e
99429942

99439943
let (dust_buffer_feerate, max_dust_htlc_exposure_msat) = {
99449944
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
9945-
let chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
9945+
let chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
99469946
let chan = chan_lock.channel_by_id.get(&channel_id).unwrap();
99479947
(chan.context().get_dust_buffer_feerate(None) as u64,
99489948
chan.context().get_max_dust_htlc_exposure_msat(&LowerBoundedFeeEstimator(nodes[0].fee_estimator)))
@@ -10440,7 +10440,7 @@ fn test_remove_expired_outbound_unfunded_channels() {
1044010440
// Asserts the outbound channel has been removed from a nodes[0]'s peer state map.
1044110441
let check_outbound_channel_existence = |should_exist: bool| {
1044210442
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
10443-
let chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
10443+
let chan_lock = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
1044410444
assert_eq!(chan_lock.channel_by_id.contains_key(&temp_channel_id), should_exist);
1044510445
};
1044610446

@@ -10491,7 +10491,7 @@ fn test_remove_expired_inbound_unfunded_channels() {
1049110491
// Asserts the inbound channel has been removed from a nodes[1]'s peer state map.
1049210492
let check_inbound_channel_existence = |should_exist: bool| {
1049310493
let per_peer_state = nodes[1].node.per_peer_state.read().unwrap();
10494-
let chan_lock = per_peer_state.get(&nodes[0].node.get_our_node_id()).unwrap().lock().unwrap();
10494+
let chan_lock = per_peer_state.get(&nodes[0].node.get_our_node_id()).unwrap().write().unwrap();
1049510495
assert_eq!(chan_lock.channel_by_id.contains_key(&temp_channel_id), should_exist);
1049610496
};
1049710497

lightning/src/ln/onion_route_tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ fn test_onion_failure() {
515515

516516
let short_channel_id = channels[1].0.contents.short_channel_id;
517517
let amt_to_forward = nodes[1].node.per_peer_state.read().unwrap().get(&nodes[2].node.get_our_node_id())
518-
.unwrap().lock().unwrap().channel_by_id.get(&channels[1].2).unwrap()
518+
.unwrap().write().unwrap().channel_by_id.get(&channels[1].2).unwrap()
519519
.context().get_counterparty_htlc_minimum_msat() - 1;
520520
let mut bogus_route = route.clone();
521521
let route_len = bogus_route.paths[0].hops.len();

lightning/src/ln/payment_tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
796796
{
797797
let per_peer_state = nodes[1].node.per_peer_state.read().unwrap();
798798
let mut peer_state = per_peer_state.get(&nodes[2].node.get_our_node_id())
799-
.unwrap().lock().unwrap();
799+
.unwrap().write().unwrap();
800800
let mut channel = peer_state.channel_by_id.get_mut(&chan_id_2).unwrap();
801801
let mut new_config = channel.context().config();
802802
new_config.forwarding_fee_base_msat += 100_000;

lightning/src/ln/reorg_tests.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ fn do_test_unconf_chan(reload_node: bool, reorg_after_reload: bool, use_funding_
258258

259259
{
260260
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
261-
let peer_state = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
261+
let peer_state = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
262262
assert_eq!(peer_state.channel_by_id.len(), 1);
263263
assert_eq!(nodes[0].node.short_to_chan_info.read().unwrap().len(), 2);
264264
}
@@ -294,7 +294,7 @@ fn do_test_unconf_chan(reload_node: bool, reorg_after_reload: bool, use_funding_
294294

295295
{
296296
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
297-
let peer_state = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
297+
let peer_state = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
298298
assert_eq!(peer_state.channel_by_id.len(), 0);
299299
assert_eq!(nodes[0].node.short_to_chan_info.read().unwrap().len(), 0);
300300
}
@@ -340,7 +340,7 @@ fn do_test_unconf_chan(reload_node: bool, reorg_after_reload: bool, use_funding_
340340

341341
{
342342
let per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
343-
let peer_state = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().lock().unwrap();
343+
let peer_state = per_peer_state.get(&nodes[1].node.get_our_node_id()).unwrap().write().unwrap();
344344
assert_eq!(peer_state.channel_by_id.len(), 0);
345345
assert_eq!(nodes[0].node.short_to_chan_info.read().unwrap().len(), 0);
346346
}

0 commit comments

Comments
 (0)