Skip to content

Commit afdcd1c

Browse files
authored
Merge pull request #2197 from jbesraa/feat/lockable_score_rw
add another lock to lockable_score
2 parents 3dffe54 + 3695b2a commit afdcd1c

File tree

9 files changed

+191
-146
lines changed

9 files changed

+191
-146
lines changed

lightning-background-processor/src/lib.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use lightning::ln::peer_handler::APeerManager;
3434
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
3535
use lightning::routing::utxo::UtxoLookup;
3636
use lightning::routing::router::Router;
37-
use lightning::routing::scoring::{Score, WriteableScore};
37+
use lightning::routing::scoring::{ScoreUpdate, WriteableScore};
3838
use lightning::util::logger::Logger;
3939
use lightning::util::persist::Persister;
4040
#[cfg(feature = "std")]
@@ -241,23 +241,27 @@ fn handle_network_graph_update<L: Deref>(
241241
fn update_scorer<'a, S: 'static + Deref<Target = SC> + Send + Sync, SC: 'a + WriteableScore<'a>>(
242242
scorer: &'a S, event: &Event
243243
) -> bool {
244-
let mut score = scorer.lock();
245244
match event {
246245
Event::PaymentPathFailed { ref path, short_channel_id: Some(scid), .. } => {
246+
let mut score = scorer.write_lock();
247247
score.payment_path_failed(path, *scid);
248248
},
249249
Event::PaymentPathFailed { ref path, payment_failed_permanently: true, .. } => {
250250
// Reached if the destination explicitly failed it back. We treat this as a successful probe
251251
// because the payment made it all the way to the destination with sufficient liquidity.
252+
let mut score = scorer.write_lock();
252253
score.probe_successful(path);
253254
},
254255
Event::PaymentPathSuccessful { path, .. } => {
256+
let mut score = scorer.write_lock();
255257
score.payment_path_successful(path);
256258
},
257259
Event::ProbeSuccessful { path, .. } => {
260+
let mut score = scorer.write_lock();
258261
score.probe_successful(path);
259262
},
260263
Event::ProbeFailed { path, short_channel_id: Some(scid), .. } => {
264+
let mut score = scorer.write_lock();
261265
score.probe_failed(path, *scid);
262266
},
263267
_ => return false,
@@ -858,7 +862,7 @@ mod tests {
858862
use lightning::ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler};
859863
use lightning::routing::gossip::{NetworkGraph, NodeId, P2PGossipSync};
860864
use lightning::routing::router::{DefaultRouter, Path, RouteHop};
861-
use lightning::routing::scoring::{ChannelUsage, Score};
865+
use lightning::routing::scoring::{ChannelUsage, ScoreUpdate, ScoreLookUp};
862866
use lightning::util::config::UserConfig;
863867
use lightning::util::ser::Writeable;
864868
use lightning::util::test_utils;
@@ -1033,12 +1037,14 @@ mod tests {
10331037
fn write<W: lightning::util::ser::Writer>(&self, _: &mut W) -> Result<(), lightning::io::Error> { Ok(()) }
10341038
}
10351039

1036-
impl Score for TestScorer {
1040+
impl ScoreLookUp for TestScorer {
10371041
type ScoreParams = ();
10381042
fn channel_penalty_msat(
10391043
&self, _short_channel_id: u64, _source: &NodeId, _target: &NodeId, _usage: ChannelUsage, _score_params: &Self::ScoreParams
10401044
) -> u64 { unimplemented!(); }
1045+
}
10411046

1047+
impl ScoreUpdate for TestScorer {
10421048
fn payment_path_failed(&mut self, actual_path: &Path, actual_short_channel_id: u64) {
10431049
if let Some(expectations) = &mut self.event_expectations {
10441050
match expectations.pop_front().unwrap() {

lightning/src/ln/channelmanager.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -10582,7 +10582,7 @@ pub mod bench {
1058210582
use bitcoin::hashes::sha256::Hash as Sha256;
1058310583
use bitcoin::{Block, BlockHeader, PackedLockTime, Transaction, TxMerkleNode, TxOut};
1058410584

10585-
use crate::sync::{Arc, Mutex};
10585+
use crate::sync::{Arc, Mutex, RwLock};
1058610586

1058710587
use criterion::Criterion;
1058810588

@@ -10619,7 +10619,7 @@ pub mod bench {
1061910619
let tx_broadcaster = test_utils::TestBroadcaster::new(network);
1062010620
let fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) };
1062110621
let logger_a = test_utils::TestLogger::with_id("node a".to_owned());
10622-
let scorer = Mutex::new(test_utils::TestScorer::new());
10622+
let scorer = RwLock::new(test_utils::TestScorer::new());
1062310623
let router = test_utils::TestRouter::new(Arc::new(NetworkGraph::new(network, &logger_a)), &scorer);
1062410624

1062510625
let mut config: UserConfig = Default::default();

lightning/src/ln/functional_test_utils.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ use crate::io;
4343
use crate::prelude::*;
4444
use core::cell::RefCell;
4545
use alloc::rc::Rc;
46-
use crate::sync::{Arc, Mutex, LockTestExt};
46+
use crate::sync::{Arc, Mutex, LockTestExt, RwLock};
4747
use core::mem;
4848
use core::iter::repeat;
4949
use bitcoin::{PackedLockTime, TxMerkleNode};
@@ -352,7 +352,7 @@ pub struct TestChanMonCfg {
352352
pub persister: test_utils::TestPersister,
353353
pub logger: test_utils::TestLogger,
354354
pub keys_manager: test_utils::TestKeysInterface,
355-
pub scorer: Mutex<test_utils::TestScorer>,
355+
pub scorer: RwLock<test_utils::TestScorer>,
356356
}
357357

358358
pub struct NodeCfg<'a> {
@@ -539,7 +539,7 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
539539
channel_monitors.insert(monitor.get_funding_txo().0, monitor);
540540
}
541541

542-
let scorer = Mutex::new(test_utils::TestScorer::new());
542+
let scorer = RwLock::new(test_utils::TestScorer::new());
543543
let mut w = test_utils::TestVecWriter(Vec::new());
544544
self.node.write(&mut w).unwrap();
545545
<(BlockHash, ChannelManager<&test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestRouter, &test_utils::TestLogger>)>::read(&mut io::Cursor::new(w.0), ChannelManagerReadArgs {
@@ -2634,7 +2634,7 @@ pub fn create_chanmon_cfgs(node_count: usize) -> Vec<TestChanMonCfg> {
26342634
let persister = test_utils::TestPersister::new();
26352635
let seed = [i as u8; 32];
26362636
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
2637-
let scorer = Mutex::new(test_utils::TestScorer::new());
2637+
let scorer = RwLock::new(test_utils::TestScorer::new());
26382638

26392639
chan_mon_cfgs.push(TestChanMonCfg { tx_broadcaster, fee_estimator, chain_source, logger, persister, keys_manager, scorer });
26402640
}

lightning/src/ln/functional_tests.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ use alloc::collections::BTreeSet;
5656
use core::default::Default;
5757
use core::iter::repeat;
5858
use bitcoin::hashes::Hash;
59-
use crate::sync::{Arc, Mutex};
59+
use crate::sync::{Arc, Mutex, RwLock};
6060

6161
use crate::ln::functional_test_utils::*;
6262
use crate::ln::chan_utils::CommitmentTransaction;
@@ -5434,7 +5434,7 @@ fn test_key_derivation_params() {
54345434
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
54355435
let chain_monitor = test_utils::TestChainMonitor::new(Some(&chanmon_cfgs[0].chain_source), &chanmon_cfgs[0].tx_broadcaster, &chanmon_cfgs[0].logger, &chanmon_cfgs[0].fee_estimator, &chanmon_cfgs[0].persister, &keys_manager);
54365436
let network_graph = Arc::new(NetworkGraph::new(Network::Testnet, &chanmon_cfgs[0].logger));
5437-
let scorer = Mutex::new(test_utils::TestScorer::new());
5437+
let scorer = RwLock::new(test_utils::TestScorer::new());
54385438
let router = test_utils::TestRouter::new(network_graph.clone(), &scorer);
54395439
let node = NodeCfg { chain_source: &chanmon_cfgs[0].chain_source, logger: &chanmon_cfgs[0].logger, tx_broadcaster: &chanmon_cfgs[0].tx_broadcaster, fee_estimator: &chanmon_cfgs[0].fee_estimator, router, chain_monitor, keys_manager: &keys_manager, network_graph, node_seed: seed, override_init_features: alloc::rc::Rc::new(core::cell::RefCell::new(None)) };
54405440
let mut node_cfgs = create_node_cfgs(3, &chanmon_cfgs);

lightning/src/ln/outbound_payment.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1516,7 +1516,7 @@ mod tests {
15161516
use crate::ln::outbound_payment::{OutboundPayments, Retry, RetryableSendFailure};
15171517
use crate::routing::gossip::NetworkGraph;
15181518
use crate::routing::router::{InFlightHtlcs, Path, PaymentParameters, Route, RouteHop, RouteParameters};
1519-
use crate::sync::{Arc, Mutex};
1519+
use crate::sync::{Arc, Mutex, RwLock};
15201520
use crate::util::errors::APIError;
15211521
use crate::util::test_utils;
15221522

@@ -1555,7 +1555,7 @@ mod tests {
15551555
let outbound_payments = OutboundPayments::new();
15561556
let logger = test_utils::TestLogger::new();
15571557
let network_graph = Arc::new(NetworkGraph::new(Network::Testnet, &logger));
1558-
let scorer = Mutex::new(test_utils::TestScorer::new());
1558+
let scorer = RwLock::new(test_utils::TestScorer::new());
15591559
let router = test_utils::TestRouter::new(network_graph, &scorer);
15601560
let secp_ctx = Secp256k1::new();
15611561
let keys_manager = test_utils::TestKeysInterface::new(&[0; 32], Network::Testnet);
@@ -1602,7 +1602,7 @@ mod tests {
16021602
let outbound_payments = OutboundPayments::new();
16031603
let logger = test_utils::TestLogger::new();
16041604
let network_graph = Arc::new(NetworkGraph::new(Network::Testnet, &logger));
1605-
let scorer = Mutex::new(test_utils::TestScorer::new());
1605+
let scorer = RwLock::new(test_utils::TestScorer::new());
16061606
let router = test_utils::TestRouter::new(network_graph, &scorer);
16071607
let secp_ctx = Secp256k1::new();
16081608
let keys_manager = test_utils::TestKeysInterface::new(&[0; 32], Network::Testnet);
@@ -1644,7 +1644,7 @@ mod tests {
16441644
let outbound_payments = OutboundPayments::new();
16451645
let logger = test_utils::TestLogger::new();
16461646
let network_graph = Arc::new(NetworkGraph::new(Network::Testnet, &logger));
1647-
let scorer = Mutex::new(test_utils::TestScorer::new());
1647+
let scorer = RwLock::new(test_utils::TestScorer::new());
16481648
let router = test_utils::TestRouter::new(network_graph, &scorer);
16491649
let secp_ctx = Secp256k1::new();
16501650
let keys_manager = test_utils::TestKeysInterface::new(&[0; 32], Network::Testnet);

lightning/src/ln/payment_tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2544,7 +2544,7 @@ fn retry_multi_path_single_failed_payment() {
25442544
}, Ok(route.clone()));
25452545

25462546
{
2547-
let scorer = chanmon_cfgs[0].scorer.lock().unwrap();
2547+
let scorer = chanmon_cfgs[0].scorer.read().unwrap();
25482548
// The initial send attempt, 2 paths
25492549
scorer.expect_usage(chans[0].short_channel_id.unwrap(), ChannelUsage { amount_msat: 10_000, inflight_htlc_msat: 0, effective_capacity: EffectiveCapacity::Unknown });
25502550
scorer.expect_usage(chans[1].short_channel_id.unwrap(), ChannelUsage { amount_msat: 100_000_001, inflight_htlc_msat: 0, effective_capacity: EffectiveCapacity::Unknown });

0 commit comments

Comments
 (0)