Skip to content

Commit 8311581

Browse files
authored
Merge pull request #2006 from TheBlueMatt/2023-02-no-recursive-read-locks
Refuse recursive read locks
2 parents b8bea74 + 065dc6e commit 8311581

13 files changed

+275
-198
lines changed

.github/workflows/build.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,9 @@ jobs:
141141
cargo test --verbose --color always --features esplora-async
142142
- name: Test backtrace-debug builds on Rust ${{ matrix.toolchain }}
143143
if: "matrix.toolchain == 'stable'"
144+
shell: bash # Default on Winblows is powershell
144145
run: |
145-
cd lightning && cargo test --verbose --color always --features backtrace
146+
cd lightning && RUST_BACKTRACE=1 cargo test --verbose --color always --features backtrace
146147
- name: Test on Rust ${{ matrix.toolchain }} with net-tokio
147148
if: "matrix.build-net-tokio && !matrix.coverage"
148149
run: cargo test --verbose --color always

lightning/src/chain/channelmonitor.rs

+12-5
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ use core::{cmp, mem};
6060
use crate::io::{self, Error};
6161
use core::convert::TryInto;
6262
use core::ops::Deref;
63-
use crate::sync::Mutex;
63+
use crate::sync::{Mutex, LockTestExt};
6464

6565
/// An update generated by the underlying channel itself which contains some new information the
6666
/// [`ChannelMonitor`] should be made aware of.
@@ -851,9 +851,13 @@ pub type TransactionOutputs = (Txid, Vec<(u32, TxOut)>);
851851

852852
impl<Signer: WriteableEcdsaChannelSigner> PartialEq for ChannelMonitor<Signer> where Signer: PartialEq {
853853
fn eq(&self, other: &Self) -> bool {
854-
let inner = self.inner.lock().unwrap();
855-
let other = other.inner.lock().unwrap();
856-
inner.eq(&other)
854+
// We need some kind of total lockorder. Absent a better idea, we sort by position in
855+
// memory and take locks in that order (assuming that we can't move within memory while a
856+
// lock is held).
857+
let ord = ((self as *const _) as usize) < ((other as *const _) as usize);
858+
let a = if ord { self.inner.unsafe_well_ordered_double_lock_self() } else { other.inner.unsafe_well_ordered_double_lock_self() };
859+
let b = if ord { other.inner.unsafe_well_ordered_double_lock_self() } else { self.inner.unsafe_well_ordered_double_lock_self() };
860+
a.eq(&b)
857861
}
858862
}
859863

@@ -4066,7 +4070,10 @@ mod tests {
40664070
fn test_prune_preimages() {
40674071
let secp_ctx = Secp256k1::new();
40684072
let logger = Arc::new(TestLogger::new());
4069-
let broadcaster = Arc::new(TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new()), blocks: Arc::new(Mutex::new(Vec::new()))});
4073+
let broadcaster = Arc::new(TestBroadcaster {
4074+
txn_broadcasted: Mutex::new(Vec::new()),
4075+
blocks: Arc::new(Mutex::new(Vec::new()))
4076+
});
40704077
let fee_estimator = TestFeeEstimator { sat_per_kw: Mutex::new(253) };
40714078

40724079
let dummy_key = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());

lightning/src/ln/chanmon_update_fail_tests.rs

+10-7
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,13 @@ fn test_monitor_and_persister_update_fail() {
108108
blocks: Arc::new(Mutex::new(vec![(genesis_block(Network::Testnet), 200); 200])),
109109
};
110110
let chain_mon = {
111-
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(outpoint).unwrap();
112-
let mut w = test_utils::TestVecWriter(Vec::new());
113-
monitor.write(&mut w).unwrap();
114-
let new_monitor = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
115-
&mut io::Cursor::new(&w.0), (nodes[0].keys_manager, nodes[0].keys_manager)).unwrap().1;
116-
assert!(new_monitor == *monitor);
111+
let new_monitor = {
112+
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(outpoint).unwrap();
113+
let new_monitor = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
114+
&mut io::Cursor::new(&monitor.encode()), (nodes[0].keys_manager, nodes[0].keys_manager)).unwrap().1;
115+
assert!(new_monitor == *monitor);
116+
new_monitor
117+
};
117118
let chain_mon = test_utils::TestChainMonitor::new(Some(&chain_source), &tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);
118119
assert_eq!(chain_mon.watch_channel(outpoint, new_monitor), ChannelMonitorUpdateStatus::Completed);
119120
chain_mon
@@ -1426,9 +1427,11 @@ fn monitor_failed_no_reestablish_response() {
14261427
{
14271428
let mut node_0_per_peer_lock;
14281429
let mut node_0_peer_state_lock;
1430+
get_channel_ref!(nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, channel_id).announcement_sigs_state = AnnouncementSigsState::PeerReceived;
1431+
}
1432+
{
14291433
let mut node_1_per_peer_lock;
14301434
let mut node_1_peer_state_lock;
1431-
get_channel_ref!(nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, channel_id).announcement_sigs_state = AnnouncementSigsState::PeerReceived;
14321435
get_channel_ref!(nodes[1], nodes[0], node_1_per_peer_lock, node_1_peer_state_lock, channel_id).announcement_sigs_state = AnnouncementSigsState::PeerReceived;
14331436
}
14341437

lightning/src/ln/channelmanager.rs

+97-58
Large diffs are not rendered by default.

lightning/src/ln/functional_test_utils.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ use crate::io;
4444
use crate::prelude::*;
4545
use core::cell::RefCell;
4646
use alloc::rc::Rc;
47-
use crate::sync::{Arc, Mutex};
47+
use crate::sync::{Arc, Mutex, LockTestExt};
4848
use core::mem;
4949
use core::iter::repeat;
5050
use bitcoin::{PackedLockTime, TxMerkleNode};
@@ -466,8 +466,8 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
466466
panic!();
467467
}
468468
}
469-
assert_eq!(*chain_source.watched_txn.lock().unwrap(), *self.chain_source.watched_txn.lock().unwrap());
470-
assert_eq!(*chain_source.watched_outputs.lock().unwrap(), *self.chain_source.watched_outputs.lock().unwrap());
469+
assert_eq!(*chain_source.watched_txn.unsafe_well_ordered_double_lock_self(), *self.chain_source.watched_txn.unsafe_well_ordered_double_lock_self());
470+
assert_eq!(*chain_source.watched_outputs.unsafe_well_ordered_double_lock_self(), *self.chain_source.watched_outputs.unsafe_well_ordered_double_lock_self());
471471
}
472472
}
473473
}
@@ -2151,9 +2151,10 @@ pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_rou
21512151
assert!(err.contains("Cannot send value that would put us over the max HTLC value in flight our peer will accept")));
21522152
}
21532153

2154-
pub fn send_payment<'a, 'b, 'c>(origin: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) {
2155-
let our_payment_preimage = route_payment(&origin, expected_route, recv_value).0;
2156-
claim_payment(&origin, expected_route, our_payment_preimage);
2154+
pub fn send_payment<'a, 'b, 'c>(origin: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) -> (PaymentPreimage, PaymentHash, PaymentSecret) {
2155+
let res = route_payment(&origin, expected_route, recv_value);
2156+
claim_payment(&origin, expected_route, res.0);
2157+
res
21572158
}
21582159

21592160
pub fn fail_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_paths: &[&[&Node<'a, 'b, 'c>]], skip_last: bool, our_payment_hash: PaymentHash) {

lightning/src/ln/functional_tests.rs

+29-26
Original file line numberDiff line numberDiff line change
@@ -4083,7 +4083,7 @@ fn do_test_htlc_timeout(send_partial_mpp: bool) {
40834083
let cur_height = CHAN_CONFIRM_DEPTH + 1; // route_payment calls send_payment, which adds 1 to the current height. So we do the same here to match.
40844084
let payment_id = PaymentId([42; 32]);
40854085
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash, Some(payment_secret), payment_id, &route).unwrap();
4086-
nodes[0].node.send_payment_along_path(&route.paths[0], &route.payment_params, &our_payment_hash, &Some(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
4086+
nodes[0].node.test_send_payment_along_path(&route.paths[0], &route.payment_params, &our_payment_hash, &Some(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
40874087
check_added_monitors!(nodes[0], 1);
40884088
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
40894089
assert_eq!(events.len(), 1);
@@ -8150,12 +8150,13 @@ fn test_update_err_monitor_lockdown() {
81508150
let logger = test_utils::TestLogger::with_id(format!("node {}", 0));
81518151
let persister = test_utils::TestPersister::new();
81528152
let watchtower = {
8153-
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(outpoint).unwrap();
8154-
let mut w = test_utils::TestVecWriter(Vec::new());
8155-
monitor.write(&mut w).unwrap();
8156-
let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
8157-
&mut io::Cursor::new(&w.0), (nodes[0].keys_manager, nodes[0].keys_manager)).unwrap().1;
8158-
assert!(new_monitor == *monitor);
8153+
let new_monitor = {
8154+
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(outpoint).unwrap();
8155+
let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
8156+
&mut io::Cursor::new(&monitor.encode()), (nodes[0].keys_manager, nodes[0].keys_manager)).unwrap().1;
8157+
assert!(new_monitor == *monitor);
8158+
new_monitor
8159+
};
81598160
let watchtower = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);
81608161
assert_eq!(watchtower.watch_channel(outpoint, new_monitor), ChannelMonitorUpdateStatus::Completed);
81618162
watchtower
@@ -8217,12 +8218,13 @@ fn test_concurrent_monitor_claim() {
82178218
let logger = test_utils::TestLogger::with_id(format!("node {}", "Alice"));
82188219
let persister = test_utils::TestPersister::new();
82198220
let watchtower_alice = {
8220-
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(outpoint).unwrap();
8221-
let mut w = test_utils::TestVecWriter(Vec::new());
8222-
monitor.write(&mut w).unwrap();
8223-
let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
8224-
&mut io::Cursor::new(&w.0), (nodes[0].keys_manager, nodes[0].keys_manager)).unwrap().1;
8225-
assert!(new_monitor == *monitor);
8221+
let new_monitor = {
8222+
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(outpoint).unwrap();
8223+
let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
8224+
&mut io::Cursor::new(&monitor.encode()), (nodes[0].keys_manager, nodes[0].keys_manager)).unwrap().1;
8225+
assert!(new_monitor == *monitor);
8226+
new_monitor
8227+
};
82268228
let watchtower = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);
82278229
assert_eq!(watchtower.watch_channel(outpoint, new_monitor), ChannelMonitorUpdateStatus::Completed);
82288230
watchtower
@@ -8246,12 +8248,13 @@ fn test_concurrent_monitor_claim() {
82468248
let logger = test_utils::TestLogger::with_id(format!("node {}", "Bob"));
82478249
let persister = test_utils::TestPersister::new();
82488250
let watchtower_bob = {
8249-
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(outpoint).unwrap();
8250-
let mut w = test_utils::TestVecWriter(Vec::new());
8251-
monitor.write(&mut w).unwrap();
8252-
let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
8253-
&mut io::Cursor::new(&w.0), (nodes[0].keys_manager, nodes[0].keys_manager)).unwrap().1;
8254-
assert!(new_monitor == *monitor);
8251+
let new_monitor = {
8252+
let monitor = nodes[0].chain_monitor.chain_monitor.get_monitor(outpoint).unwrap();
8253+
let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
8254+
&mut io::Cursor::new(&monitor.encode()), (nodes[0].keys_manager, nodes[0].keys_manager)).unwrap().1;
8255+
assert!(new_monitor == *monitor);
8256+
new_monitor
8257+
};
82558258
let watchtower = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);
82568259
assert_eq!(watchtower.watch_channel(outpoint, new_monitor), ChannelMonitorUpdateStatus::Completed);
82578260
watchtower
@@ -9141,20 +9144,20 @@ fn test_inconsistent_mpp_params() {
91419144
dup_route.paths.push(route.paths[1].clone());
91429145
nodes[0].node.test_add_new_pending_payment(our_payment_hash, Some(our_payment_secret), payment_id, &dup_route).unwrap()
91439146
};
9144-
{
9145-
nodes[0].node.send_payment_along_path(&route.paths[0], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 15_000_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
9146-
check_added_monitors!(nodes[0], 1);
9147+
nodes[0].node.test_send_payment_along_path(&route.paths[0], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 15_000_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
9148+
check_added_monitors!(nodes[0], 1);
91479149

9150+
{
91489151
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
91499152
assert_eq!(events.len(), 1);
91509153
pass_along_path(&nodes[0], &[&nodes[1], &nodes[3]], 15_000_000, our_payment_hash, Some(our_payment_secret), events.pop().unwrap(), false, None);
91519154
}
91529155
assert!(nodes[3].node.get_and_clear_pending_events().is_empty());
91539156

9154-
{
9155-
nodes[0].node.send_payment_along_path(&route.paths[1], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 14_000_000, cur_height, payment_id, &None, session_privs[1]).unwrap();
9156-
check_added_monitors!(nodes[0], 1);
9157+
nodes[0].node.test_send_payment_along_path(&route.paths[1], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 14_000_000, cur_height, payment_id, &None, session_privs[1]).unwrap();
9158+
check_added_monitors!(nodes[0], 1);
91579159

9160+
{
91589161
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
91599162
assert_eq!(events.len(), 1);
91609163
let payment_event = SendEvent::from_event(events.pop().unwrap());
@@ -9197,7 +9200,7 @@ fn test_inconsistent_mpp_params() {
91979200

91989201
expect_payment_failed_conditions(&nodes[0], our_payment_hash, true, PaymentFailedConditions::new().mpp_parts_remain());
91999202

9200-
nodes[0].node.send_payment_along_path(&route.paths[1], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 15_000_000, cur_height, payment_id, &None, session_privs[2]).unwrap();
9203+
nodes[0].node.test_send_payment_along_path(&route.paths[1], &payment_params_opt, &our_payment_hash, &Some(our_payment_secret), 15_000_000, cur_height, payment_id, &None, session_privs[2]).unwrap();
92019204
check_added_monitors!(nodes[0], 1);
92029205

92039206
let mut events = nodes[0].node.get_and_clear_pending_msg_events();

lightning/src/ln/payment_tests.rs

+27-26
Original file line numberDiff line numberDiff line change
@@ -1192,33 +1192,31 @@ fn test_trivial_inflight_htlc_tracking(){
11921192
let (_, _, chan_2_id, _) = create_announced_chan_between_nodes(&nodes, 1, 2);
11931193

11941194
// Send and claim the payment. Inflight HTLCs should be empty.
1195-
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], 500000);
1196-
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret), PaymentId(payment_hash.0)).unwrap();
1197-
check_added_monitors!(nodes[0], 1);
1198-
pass_along_route(&nodes[0], &[&vec!(&nodes[1], &nodes[2])[..]], 500000, payment_hash, payment_secret);
1199-
claim_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], payment_preimage);
1195+
let payment_hash = send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 500000).1;
1196+
let inflight_htlcs = node_chanmgrs[0].compute_inflight_htlcs();
12001197
{
1201-
let inflight_htlcs = node_chanmgrs[0].compute_inflight_htlcs();
1202-
12031198
let mut node_0_per_peer_lock;
12041199
let mut node_0_peer_state_lock;
1205-
let mut node_1_per_peer_lock;
1206-
let mut node_1_peer_state_lock;
12071200
let channel_1 = get_channel_ref!(&nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, chan_1_id);
1208-
let channel_2 = get_channel_ref!(&nodes[1], nodes[2], node_1_per_peer_lock, node_1_peer_state_lock, chan_2_id);
12091201

12101202
let chan_1_used_liquidity = inflight_htlcs.used_liquidity_msat(
12111203
&NodeId::from_pubkey(&nodes[0].node.get_our_node_id()) ,
12121204
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()),
12131205
channel_1.get_short_channel_id().unwrap()
12141206
);
1207+
assert_eq!(chan_1_used_liquidity, None);
1208+
}
1209+
{
1210+
let mut node_1_per_peer_lock;
1211+
let mut node_1_peer_state_lock;
1212+
let channel_2 = get_channel_ref!(&nodes[1], nodes[2], node_1_per_peer_lock, node_1_peer_state_lock, chan_2_id);
1213+
12151214
let chan_2_used_liquidity = inflight_htlcs.used_liquidity_msat(
12161215
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()) ,
12171216
&NodeId::from_pubkey(&nodes[2].node.get_our_node_id()),
12181217
channel_2.get_short_channel_id().unwrap()
12191218
);
12201219

1221-
assert_eq!(chan_1_used_liquidity, None);
12221220
assert_eq!(chan_2_used_liquidity, None);
12231221
}
12241222
let pending_payments = nodes[0].node.list_recent_payments();
@@ -1231,30 +1229,32 @@ fn test_trivial_inflight_htlc_tracking(){
12311229
}
12321230

12331231
// Send the payment, but do not claim it. Our inflight HTLCs should contain the pending payment.
1234-
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], 500000);
1232+
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 500000);
1233+
let inflight_htlcs = node_chanmgrs[0].compute_inflight_htlcs();
12351234
{
1236-
let inflight_htlcs = node_chanmgrs[0].compute_inflight_htlcs();
1237-
12381235
let mut node_0_per_peer_lock;
12391236
let mut node_0_peer_state_lock;
1240-
let mut node_1_per_peer_lock;
1241-
let mut node_1_peer_state_lock;
12421237
let channel_1 = get_channel_ref!(&nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, chan_1_id);
1243-
let channel_2 = get_channel_ref!(&nodes[1], nodes[2], node_1_per_peer_lock, node_1_peer_state_lock, chan_2_id);
12441238

12451239
let chan_1_used_liquidity = inflight_htlcs.used_liquidity_msat(
12461240
&NodeId::from_pubkey(&nodes[0].node.get_our_node_id()) ,
12471241
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()),
12481242
channel_1.get_short_channel_id().unwrap()
12491243
);
1244+
// First hop accounts for expected 1000 msat fee
1245+
assert_eq!(chan_1_used_liquidity, Some(501000));
1246+
}
1247+
{
1248+
let mut node_1_per_peer_lock;
1249+
let mut node_1_peer_state_lock;
1250+
let channel_2 = get_channel_ref!(&nodes[1], nodes[2], node_1_per_peer_lock, node_1_peer_state_lock, chan_2_id);
1251+
12501252
let chan_2_used_liquidity = inflight_htlcs.used_liquidity_msat(
12511253
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()) ,
12521254
&NodeId::from_pubkey(&nodes[2].node.get_our_node_id()),
12531255
channel_2.get_short_channel_id().unwrap()
12541256
);
12551257

1256-
// First hop accounts for expected 1000 msat fee
1257-
assert_eq!(chan_1_used_liquidity, Some(501000));
12581258
assert_eq!(chan_2_used_liquidity, Some(500000));
12591259
}
12601260
let pending_payments = nodes[0].node.list_recent_payments();
@@ -1269,28 +1269,29 @@ fn test_trivial_inflight_htlc_tracking(){
12691269
nodes[0].node.timer_tick_occurred();
12701270
}
12711271

1272+
let inflight_htlcs = node_chanmgrs[0].compute_inflight_htlcs();
12721273
{
1273-
let inflight_htlcs = node_chanmgrs[0].compute_inflight_htlcs();
1274-
12751274
let mut node_0_per_peer_lock;
12761275
let mut node_0_peer_state_lock;
1277-
let mut node_1_per_peer_lock;
1278-
let mut node_1_peer_state_lock;
12791276
let channel_1 = get_channel_ref!(&nodes[0], nodes[1], node_0_per_peer_lock, node_0_peer_state_lock, chan_1_id);
1280-
let channel_2 = get_channel_ref!(&nodes[1], nodes[2], node_1_per_peer_lock, node_1_peer_state_lock, chan_2_id);
12811277

12821278
let chan_1_used_liquidity = inflight_htlcs.used_liquidity_msat(
12831279
&NodeId::from_pubkey(&nodes[0].node.get_our_node_id()) ,
12841280
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()),
12851281
channel_1.get_short_channel_id().unwrap()
12861282
);
1283+
assert_eq!(chan_1_used_liquidity, None);
1284+
}
1285+
{
1286+
let mut node_1_per_peer_lock;
1287+
let mut node_1_peer_state_lock;
1288+
let channel_2 = get_channel_ref!(&nodes[1], nodes[2], node_1_per_peer_lock, node_1_peer_state_lock, chan_2_id);
1289+
12871290
let chan_2_used_liquidity = inflight_htlcs.used_liquidity_msat(
12881291
&NodeId::from_pubkey(&nodes[1].node.get_our_node_id()) ,
12891292
&NodeId::from_pubkey(&nodes[2].node.get_our_node_id()),
12901293
channel_2.get_short_channel_id().unwrap()
12911294
);
1292-
1293-
assert_eq!(chan_1_used_liquidity, None);
12941295
assert_eq!(chan_2_used_liquidity, None);
12951296
}
12961297

0 commit comments

Comments
 (0)