Skip to content

Commit e5f0171

Browse files
committed
add timer
1 parent 9c63b13 commit e5f0171

File tree

4 files changed

+100
-11
lines changed

4 files changed

+100
-11
lines changed

src/builder.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ use lightning::ln::peer_handler::{IgnoringMessageHandler, MessageHandler};
3838
use lightning::routing::gossip::NodeAlias;
3939
use lightning::routing::router::DefaultRouter;
4040
use lightning::routing::scoring::{
41-
CombinedScorer, ProbabilisticScorer, ProbabilisticScoringDecayParameters, ProbabilisticScoringFeeParameters
41+
CombinedScorer, ProbabilisticScorer, ProbabilisticScoringDecayParameters,
42+
ProbabilisticScoringFeeParameters,
4243
};
4344
use lightning::sign::EntropySource;
4445

@@ -886,19 +887,15 @@ fn build_with_store_internal(
886887
Err(e) => {
887888
if e.kind() == std::io::ErrorKind::NotFound {
888889
let params = ProbabilisticScoringDecayParameters::default();
889-
ProbabilisticScorer::new(
890-
params,
891-
Arc::clone(&network_graph),
892-
Arc::clone(&logger),
893-
)
890+
ProbabilisticScorer::new(params, Arc::clone(&network_graph), Arc::clone(&logger))
894891
} else {
895892
return Err(BuildError::ReadFailed);
896893
}
897894
},
898895
};
899-
896+
900897
let scorer = Arc::new(Mutex::new(CombinedScorer::new(local_scorer)));
901-
898+
902899
let scoring_fee_params = ProbabilisticScoringFeeParameters::default();
903900
let router = Arc::new(DefaultRouter::new(
904901
Arc::clone(&network_graph),
@@ -907,7 +904,7 @@ fn build_with_store_internal(
907904
Arc::clone(&scorer),
908905
scoring_fee_params,
909906
));
910-
907+
911908
// Read ChannelMonitor state from store
912909
let channel_monitors = match read_channel_monitors(
913910
Arc::clone(&kv_store),

src/config.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ pub(crate) const PEER_RECONNECTION_INTERVAL: Duration = Duration::from_secs(10);
5050
// The time in-between RGS sync attempts.
5151
pub(crate) const RGS_SYNC_INTERVAL: Duration = Duration::from_secs(60 * 60);
5252

53+
// The time in-between external scores sync attempts.
54+
pub(crate) const EXTERNAL_SCORES_SYNC_INTERVAL: Duration = Duration::from_secs(60 * 60);
55+
5356
// The time in-between node announcement broadcast attempts.
5457
pub(crate) const NODE_ANN_BCAST_INTERVAL: Duration = Duration::from_secs(60 * 60);
5558

@@ -71,6 +74,9 @@ pub(crate) const TX_BROADCAST_TIMEOUT_SECS: u64 = 5;
7174
// The timeout after which we abort a RGS sync operation.
7275
pub(crate) const RGS_SYNC_TIMEOUT_SECS: u64 = 5;
7376

77+
// The timeout after which we abort a external scores sync operation.
78+
pub(crate) const EXTERNAL_SCORES_SYNC_TIMEOUT_SECS: u64 = 5;
79+
7480
// The length in bytes of our wallets' keys seed.
7581
pub(crate) const WALLET_KEYS_SEED_LEN: usize = 64;
7682

@@ -162,6 +168,9 @@ pub struct Config {
162168
/// **Note:** If unset, default parameters will be used, and you will be able to override the
163169
/// parameters on a per-payment basis in the corresponding method calls.
164170
pub sending_parameters: Option<SendingParameters>,
171+
172+
/// Optional URL to periodically fetch external scores from.
173+
pub external_scores_url: Option<String>,
165174
}
166175

167176
impl Default for Config {
@@ -177,6 +186,7 @@ impl Default for Config {
177186
anchor_channels_config: Some(AnchorChannelsConfig::default()),
178187
sending_parameters: None,
179188
node_alias: None,
189+
external_scores_url: None,
180190
}
181191
}
182192
}

src/lib.rs

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ mod wallet;
9999
pub use bip39;
100100
pub use bitcoin;
101101
pub use lightning;
102+
use lightning::routing::scoring::{ChannelLiquidities, CombinedScorer};
103+
use lightning::util::ser::Readable;
102104
pub use lightning_invoice;
103105
pub use lightning_types;
104106
pub use vss_client;
@@ -122,7 +124,8 @@ pub use builder::NodeBuilder as Builder;
122124

123125
use chain::ChainSource;
124126
use config::{
125-
default_user_config, may_announce_channel, ChannelConfig, Config, NODE_ANN_BCAST_INTERVAL,
127+
default_user_config, may_announce_channel, ChannelConfig, Config,
128+
EXTERNAL_SCORES_SYNC_INTERVAL, EXTERNAL_SCORES_SYNC_TIMEOUT_SECS, NODE_ANN_BCAST_INTERVAL,
126129
PEER_RECONNECTION_INTERVAL, RGS_SYNC_INTERVAL,
127130
};
128131
use connection::ConnectionManager;
@@ -162,6 +165,7 @@ use bitcoin::secp256k1::PublicKey;
162165
use rand::Rng;
163166

164167
use std::default::Default;
168+
use std::io::Cursor;
165169
use std::net::ToSocketAddrs;
166170
use std::sync::atomic::{AtomicBool, Ordering};
167171
use std::sync::{Arc, Mutex, RwLock};
@@ -306,6 +310,36 @@ impl Node {
306310
});
307311
}
308312

313+
if let Some(url) = &self.config.external_scores_url {
314+
let external_scores_sync_logger = Arc::clone(&self.logger);
315+
let external_scores_scorer = Arc::clone(&self.scorer);
316+
let mut stop_sync = self.stop_sender.subscribe();
317+
let url = url.clone();
318+
319+
runtime.spawn(async move {
320+
let mut interval = tokio::time::interval(EXTERNAL_SCORES_SYNC_INTERVAL);
321+
loop {
322+
tokio::select! {
323+
_ = stop_sync.changed() => {
324+
log_trace!(
325+
external_scores_sync_logger,
326+
"Stopping background syncing external scores.",
327+
);
328+
return;
329+
}
330+
_ = interval.tick() => {
331+
log_trace!(
332+
external_scores_sync_logger,
333+
"Background sync of external scores started.",
334+
);
335+
336+
sync_external_scores(&external_scores_sync_logger, &external_scores_scorer, &url).await;
337+
}
338+
}
339+
}
340+
});
341+
}
342+
309343
if let Some(listening_addresses) = &self.config.listening_addresses {
310344
// Setup networking
311345
let peer_manager_connection_handler = Arc::clone(&self.peer_manager);
@@ -1612,3 +1646,51 @@ pub(crate) fn total_anchor_channels_reserve_sats(
16121646
* anchor_channels_config.per_channel_reserve_sats
16131647
})
16141648
}
1649+
1650+
async fn sync_external_scores(
1651+
logger: &FilesystemLogger, scorer: &Mutex<CombinedScorer<Arc<Graph>, Arc<FilesystemLogger>>>,
1652+
url: &String,
1653+
) -> () {
1654+
let response = tokio::time::timeout(
1655+
Duration::from_secs(EXTERNAL_SCORES_SYNC_TIMEOUT_SECS),
1656+
reqwest::get(url),
1657+
)
1658+
.await;
1659+
1660+
match response {
1661+
Ok(Ok(response)) => {
1662+
let body = response.bytes().await;
1663+
match body {
1664+
Err(e) => {
1665+
log_trace!(
1666+
logger,
1667+
"Failed to read external scores update from http source: {}",
1668+
e
1669+
);
1670+
return;
1671+
},
1672+
Ok(body) => {
1673+
let mut reader = Cursor::new(body);
1674+
match ChannelLiquidities::read(&mut reader) {
1675+
Ok(liquidities) => {
1676+
scorer.lock().unwrap().merge(liquidities);
1677+
log_trace!(logger, "External scores merged successfully",);
1678+
},
1679+
Err(e) => {
1680+
log_trace!(logger, "Failed to parse external scores update: {}", e);
1681+
return;
1682+
},
1683+
}
1684+
},
1685+
}
1686+
},
1687+
Err(e) => {
1688+
log_trace!(logger, "Retrieving external scores timed out: {}", e);
1689+
return;
1690+
},
1691+
Ok(Err(e)) => {
1692+
log_trace!(logger, "Failed to retrieve external scores update: {}", e);
1693+
return;
1694+
},
1695+
}
1696+
}

src/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use lightning::ln::types::ChannelId;
2222
use lightning::routing::gossip;
2323
use lightning::routing::router::DefaultRouter;
2424
use lightning::routing::scoring::CombinedScorer;
25-
use lightning::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringFeeParameters};
25+
use lightning::routing::scoring::ProbabilisticScoringFeeParameters;
2626
use lightning::sign::InMemorySigner;
2727
use lightning::util::persist::KVStore;
2828
use lightning::util::ser::{Readable, Writeable, Writer};

0 commit comments

Comments
 (0)