From ba311055f16c174479576b7c9b1b89051e7bffac Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 13 Nov 2025 13:18:55 +0100 Subject: [PATCH 1/4] Add LoggerScope --- lightning/src/chain/chainmonitor.rs | 4 ++- lightning/src/chain/channelmonitor.rs | 6 ++++ lightning/src/util/logger.rs | 48 ++++++++++++++++++++++++++- lightning/src/util/macro_logger.rs | 11 ++++++ lightning/src/util/persist.rs | 3 +- 5 files changed, 69 insertions(+), 3 deletions(-) diff --git a/lightning/src/chain/chainmonitor.rs b/lightning/src/chain/chainmonitor.rs index 046e285e206..1cc534f0c06 100644 --- a/lightning/src/chain/chainmonitor.rs +++ b/lightning/src/chain/chainmonitor.rs @@ -53,7 +53,7 @@ use crate::sync::{Mutex, MutexGuard, RwLock, RwLockReadGuard}; use crate::types::features::{InitFeatures, NodeFeatures}; use crate::util::async_poll::{MaybeSend, MaybeSync}; use crate::util::errors::APIError; -use crate::util::logger::{Logger, WithContext}; +use crate::util::logger::{Logger, LoggerScope, WithContext}; use crate::util::native_async::FutureSpawner; use crate::util::persist::{KVStore, MonitorName, MonitorUpdatingPersisterAsync}; #[cfg(peer_storage)] @@ -1426,6 +1426,8 @@ where Some(monitor_state) => { let monitor = &monitor_state.monitor; let logger = WithChannelMonitor::from(&self.logger, &monitor, None); + let _scope = LoggerScope::new(&logger); + log_trace!( logger, "Updating ChannelMonitor to id {} for channel {}", diff --git a/lightning/src/chain/channelmonitor.rs b/lightning/src/chain/channelmonitor.rs index 1d035b68650..6fde79dc1b3 100644 --- a/lightning/src/chain/channelmonitor.rs +++ b/lightning/src/chain/channelmonitor.rs @@ -3815,6 +3815,12 @@ impl ChannelMonitorImpl { } })); } + + log_info_tls!( + "Recording counterparty fulfillment of HTLC id {:?} with preimage {} in channel monitor", + *claimed_htlc_id, + *claimed_preimage + ); self.counterparty_fulfilled_htlcs.insert(*claimed_htlc_id, *claimed_preimage); } diff --git a/lightning/src/util/logger.rs b/lightning/src/util/logger.rs index 283d3158144..6c7758409f5 100644 --- a/lightning/src/util/logger.rs +++ b/lightning/src/util/logger.rs @@ -15,6 +15,7 @@ use bitcoin::secp256k1::PublicKey; +use core::cell::RefCell; use core::cmp; use core::fmt; use core::ops::Deref; @@ -261,15 +262,60 @@ impl + Clone> fmt::Display fo } } +thread_local! { + pub(crate) static TLS_LOGGER: RefCell> = RefCell::new(None); +} + +pub struct LoggerScope<'a> { + _marker: std::marker::PhantomData<&'a ()>, +} + +impl<'a> LoggerScope<'a> { + pub fn new(logger: &'a L) -> Self { + TLS_LOGGER.with(|cell| { + let mut borrow = cell.borrow_mut(); + + // Prevent nested scopes + if borrow.is_some() { + panic!("LoggerScope already active in this thread"); + } + + // Transmute is safe in practice because the RAII pattern ensures: + // - The TLS logger reference is only used while the guard exists. + // - The guard cannot outlive the logger (thanks to PhantomData<'a>). + let logger_ref: &dyn Logger = logger; + let logger_ref_static: &'static dyn Logger = unsafe { std::mem::transmute(logger_ref) }; + + *borrow = Some(logger_ref_static); + }); + LoggerScope { _marker: std::marker::PhantomData } + } +} + +impl<'a> Drop for LoggerScope<'a> { + fn drop(&mut self) { + TLS_LOGGER.with(|cell| { + *cell.borrow_mut() = None; + }); + } +} + #[cfg(test)] mod tests { use crate::ln::types::ChannelId; use crate::sync::Arc; use crate::types::payment::PaymentHash; - use crate::util::logger::{Level, Logger, WithContext}; + use crate::util::logger::{Level, Logger, LoggerScope, WithContext}; use crate::util::test_utils::TestLogger; use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey}; + #[test] + fn logger_scope() { + let logger = TestLogger::new(); + let _scope = LoggerScope::new(&logger); + log_info_tls!("Info") + } + #[test] fn test_level_show() { assert_eq!("INFO", Level::Info.to_string()); diff --git a/lightning/src/util/macro_logger.rs b/lightning/src/util/macro_logger.rs index ec9eb14ba38..50406a0dfda 100644 --- a/lightning/src/util/macro_logger.rs +++ b/lightning/src/util/macro_logger.rs @@ -203,6 +203,17 @@ macro_rules! log_info { ) } +#[macro_export] +macro_rules! log_info_tls { + ($($arg:tt)+) => { + $crate::util::logger::TLS_LOGGER.with(|cell| { + if let Some(logger) = &*cell.borrow() { + log_info!(logger, $($arg)*); + } + }) + }; +} + /// Log at the `DEBUG` level. #[macro_export] macro_rules! log_debug { diff --git a/lightning/src/util/persist.rs b/lightning/src/util/persist.rs index d00e29e686a..c97cea475f4 100644 --- a/lightning/src/util/persist.rs +++ b/lightning/src/util/persist.rs @@ -35,7 +35,7 @@ use crate::ln::types::ChannelId; use crate::sign::{ecdsa::EcdsaChannelSigner, EntropySource, SignerProvider}; use crate::sync::Mutex; use crate::util::async_poll::{dummy_waker, AsyncResult, MaybeSend, MaybeSync}; -use crate::util::logger::Logger; +use crate::util::logger::{Logger, LoggerScope}; use crate::util::native_async::FutureSpawner; use crate::util::ser::{Readable, ReadableArgs, Writeable}; use crate::util::wakers::Notifier; @@ -1063,6 +1063,7 @@ where Err(err) => return Err(err), }; + // let _scope = LoggerScope::new(&*self.logger); // DOES NOT WORK monitor .update_monitor(&update, &self.broadcaster, &self.fee_estimator, &self.logger) .map_err(|e| { From 95c377b515b9cc3cdcde82ec3ec6121bf1fb28ae Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Mon, 17 Nov 2025 02:12:13 +0000 Subject: [PATCH 2/4] dyn the loggers --- lightning-background-processor/src/lib.rs | 25 +++++++++-------- lightning-block-sync/src/gossip.rs | 9 +++--- lightning-rapid-gossip-sync/src/lib.rs | 5 ++-- lightning-rapid-gossip-sync/src/processing.rs | 3 +- lightning/src/ln/channelmanager.rs | 2 +- lightning/src/onion_message/messenger.rs | 14 +++++----- lightning/src/routing/gossip.rs | 28 +++++++++++-------- lightning/src/routing/router.rs | 26 ++++++++++++----- lightning/src/routing/scoring.rs | 28 ++++++++++--------- lightning/src/routing/utxo.rs | 10 +++++-- 10 files changed, 89 insertions(+), 61 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index 19333c5823a..9f2fb6b06d0 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -51,6 +51,7 @@ use lightning::routing::utxo::UtxoLookup; use lightning::sign::{ ChangeDestinationSource, ChangeDestinationSourceSync, EntropySource, OutputSpender, }; +use lightning::util::async_poll::{MaybeSend, MaybeSync}; use lightning::util::logger::Logger; use lightning::util::persist::{ KVStore, KVStoreSync, KVStoreSyncWrapper, CHANNEL_MANAGER_PERSISTENCE_KEY, @@ -184,8 +185,8 @@ pub enum GossipSync< U: Deref, L: Deref, > where + L::Target: Logger + MaybeSend + MaybeSync, U::Target: UtxoLookup, - L::Target: Logger, { /// Gossip sync via the lightning peer-to-peer network as defined by BOLT 7. P2P(P), @@ -203,8 +204,8 @@ impl< L: Deref, > GossipSync where + L::Target: Logger + MaybeSend + MaybeSync, U::Target: UtxoLookup, - L::Target: Logger, { fn network_graph(&self) -> Option<&G> { match self { @@ -237,8 +238,8 @@ impl< L: Deref, > GossipSync, G, U, L> where + L::Target: Logger + MaybeSend + MaybeSync, U::Target: UtxoLookup, - L::Target: Logger, { /// Initializes a new [`GossipSync::P2P`] variant. pub fn p2p(gossip_sync: P) -> Self { @@ -259,8 +260,9 @@ impl< G, &'a (dyn UtxoLookup + Send + Sync), L, - > where - L::Target: Logger, + > +where + L::Target: Logger + MaybeSend + MaybeSync, { /// Initializes a new [`GossipSync::Rapid`] variant. pub fn rapid(gossip_sync: R) -> Self { @@ -276,8 +278,9 @@ impl<'a, L: Deref> &'a NetworkGraph, &'a (dyn UtxoLookup + Send + Sync), L, - > where - L::Target: Logger, + > +where + L::Target: Logger + MaybeSend + MaybeSync, { /// Initializes a new [`GossipSync::None`] variant. pub fn none() -> Self { @@ -287,7 +290,7 @@ impl<'a, L: Deref> fn handle_network_graph_update(network_graph: &NetworkGraph, event: &Event) where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { if let Event::PaymentPathFailed { failure: PathFailure::OnPath { network_update: Some(ref upd) }, @@ -911,11 +914,11 @@ pub async fn process_events_async< sleeper: Sleeper, mobile_interruptable_platform: bool, fetch_time: FetchTime, ) -> Result<(), lightning::io::Error> where + L::Target: Logger + MaybeSend + MaybeSync, UL::Target: UtxoLookup, CF::Target: chain::Filter, T::Target: BroadcasterInterface, F::Target: FeeEstimator, - L::Target: Logger, P::Target: Persist<::Signer>, ES::Target: EntropySource, CM::Target: AChannelManager, @@ -1382,11 +1385,11 @@ pub async fn process_events_async_with_kv_store_sync< sleeper: Sleeper, mobile_interruptable_platform: bool, fetch_time: FetchTime, ) -> Result<(), lightning::io::Error> where + L::Target: Logger + MaybeSend + MaybeSync, UL::Target: UtxoLookup, CF::Target: chain::Filter, T::Target: BroadcasterInterface, F::Target: FeeEstimator, - L::Target: Logger, P::Target: Persist<::Signer>, ES::Target: EntropySource, CM::Target: AChannelManager, @@ -1500,7 +1503,7 @@ impl BackgroundProcessor { CF::Target: 'static + chain::Filter, T::Target: 'static + BroadcasterInterface, F::Target: 'static + FeeEstimator, - L::Target: 'static + Logger, + L::Target: Logger + MaybeSend + MaybeSync, P::Target: 'static + Persist<::Signer>, ES::Target: 'static + EntropySource, CM::Target: AChannelManager, diff --git a/lightning-block-sync/src/gossip.rs b/lightning-block-sync/src/gossip.rs index 0fe221b9231..6904ec67f8e 100644 --- a/lightning-block-sync/src/gossip.rs +++ b/lightning-block-sync/src/gossip.rs @@ -12,6 +12,7 @@ use bitcoin::transaction::{OutPoint, TxOut}; use lightning::ln::peer_handler::APeerManager; use lightning::routing::gossip::{NetworkGraph, P2PGossipSync}; use lightning::routing::utxo::{UtxoFuture, UtxoLookup, UtxoLookupError, UtxoResult}; +use lightning::util::async_poll::{MaybeSend, MaybeSync}; use lightning::util::logger::Logger; use lightning::util::native_async::FutureSpawner; @@ -127,8 +128,8 @@ pub struct GossipVerifier< Blocks: Deref + Send + Sync + 'static + Clone, L: Deref + Send + Sync + 'static, > where + L::Target: Logger + MaybeSend + MaybeSync, Blocks::Target: UtxoSource, - L::Target: Logger, { source: Blocks, peer_manager_wake: Arc, @@ -142,8 +143,8 @@ const BLOCK_CACHE_SIZE: usize = 5; impl GossipVerifier where + L::Target: Logger + MaybeSend + MaybeSync, Blocks::Target: UtxoSource, - L::Target: Logger, { /// Constructs a new [`GossipVerifier`]. /// @@ -251,8 +252,8 @@ where impl Deref for GossipVerifier where + L::Target: Logger + MaybeSend + MaybeSync, Blocks::Target: UtxoSource, - L::Target: Logger, { type Target = Self; fn deref(&self) -> &Self { @@ -263,8 +264,8 @@ where impl UtxoLookup for GossipVerifier where + L::Target: Logger + MaybeSend + MaybeSync, Blocks::Target: UtxoSource, - L::Target: Logger, { fn get_utxo(&self, _chain_hash: &ChainHash, short_channel_id: u64) -> UtxoResult { let res = UtxoFuture::new(); diff --git a/lightning-rapid-gossip-sync/src/lib.rs b/lightning-rapid-gossip-sync/src/lib.rs index 429a3560be0..79ac39515c7 100644 --- a/lightning-rapid-gossip-sync/src/lib.rs +++ b/lightning-rapid-gossip-sync/src/lib.rs @@ -87,6 +87,7 @@ use core::sync::atomic::{AtomicBool, Ordering}; use lightning::io; use lightning::ln::msgs::{DecodeError, LightningError}; use lightning::routing::gossip::NetworkGraph; +use lightning::util::async_poll::{MaybeSend, MaybeSync}; use lightning::util::logger::Logger; /// Core functionality of this crate @@ -134,7 +135,7 @@ impl From for GraphSyncError { /// [crate-level documentation]: crate pub struct RapidGossipSync>, L: Deref> where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { network_graph: NG, logger: L, @@ -143,7 +144,7 @@ where impl>, L: Deref> RapidGossipSync where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { /// Instantiate a new [`RapidGossipSync`] instance. pub fn new(network_graph: NG, logger: L) -> Self { diff --git a/lightning-rapid-gossip-sync/src/processing.rs b/lightning-rapid-gossip-sync/src/processing.rs index 8319506b574..6389a58edfc 100644 --- a/lightning-rapid-gossip-sync/src/processing.rs +++ b/lightning-rapid-gossip-sync/src/processing.rs @@ -10,6 +10,7 @@ use lightning::ln::msgs::{ UnsignedNodeAnnouncement, }; use lightning::routing::gossip::{NetworkGraph, NodeAlias, NodeId}; +use lightning::util::async_poll::{MaybeSend, MaybeSync}; use lightning::util::logger::Logger; use lightning::util::ser::{BigSize, FixedLengthReader, Readable}; use lightning::{log_debug, log_given_level, log_gossip, log_trace, log_warn}; @@ -39,7 +40,7 @@ const STALE_RGS_UPDATE_AGE_LIMIT_SECS: u64 = 60 * 60 * 24 * 14; impl>, L: Deref> RapidGossipSync where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { #[cfg(feature = "std")] pub(crate) fn update_network_graph_from_byte_stream( diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 8abb2378627..aebcb999dd5 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -1953,7 +1953,7 @@ where /// # fn read_channel_monitors() -> Vec> { vec![] } /// # fn example< /// # 'a, -/// # L: lightning::util::logger::Logger, +/// # L: lightning::util::logger::Logger + Send + Sync, /// # ES: lightning::sign::EntropySource, /// # S: for <'b> lightning::routing::scoring::LockableScore<'b, ScoreLookUp = SL>, /// # SL: lightning::routing::scoring::ScoreLookUp, diff --git a/lightning/src/onion_message/messenger.rs b/lightning/src/onion_message/messenger.rs index 9a2c06bb72f..fc0769030fc 100644 --- a/lightning/src/onion_message/messenger.rs +++ b/lightning/src/onion_message/messenger.rs @@ -38,7 +38,7 @@ use crate::ln::onion_utils; use crate::routing::gossip::{NetworkGraph, NodeId, ReadOnlyNetworkGraph}; use crate::sign::{EntropySource, NodeSigner, ReceiveAuthKey, Recipient}; use crate::types::features::{InitFeatures, NodeFeatures}; -use crate::util::async_poll::{MultiResultFuturePoller, ResultFuture}; +use crate::util::async_poll::{MaybeSend, MaybeSync, MultiResultFuturePoller, ResultFuture}; use crate::util::logger::{Logger, WithContext}; use crate::util::ser::Writeable; use crate::util::wakers::{Future, Notifier}; @@ -548,7 +548,7 @@ pub trait MessageRouter { /// message, and thus an `Err` is returned. pub struct DefaultMessageRouter>, L: Deref, ES: Deref> where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, ES::Target: EntropySource, { network_graph: G, @@ -565,7 +565,7 @@ pub(crate) const PADDED_PATH_LENGTH: usize = 4; impl>, L: Deref, ES: Deref> DefaultMessageRouter where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, ES::Target: EntropySource, { /// Creates a [`DefaultMessageRouter`] using the given [`NetworkGraph`]. @@ -719,7 +719,7 @@ where impl>, L: Deref, ES: Deref> MessageRouter for DefaultMessageRouter where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, ES::Target: EntropySource, { fn find_path( @@ -758,7 +758,7 @@ where /// message, and thus an `Err` is returned. pub struct NodeIdMessageRouter>, L: Deref, ES: Deref> where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, ES::Target: EntropySource, { network_graph: G, @@ -767,7 +767,7 @@ where impl>, L: Deref, ES: Deref> NodeIdMessageRouter where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, ES::Target: EntropySource, { /// Creates a [`NodeIdMessageRouter`] using the given [`NetworkGraph`]. @@ -779,7 +779,7 @@ where impl>, L: Deref, ES: Deref> MessageRouter for NodeIdMessageRouter where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, ES::Target: EntropySource, { fn find_path( diff --git a/lightning/src/routing/gossip.rs b/lightning/src/routing/gossip.rs index 80ffbf9fb6c..81ba46dc533 100644 --- a/lightning/src/routing/gossip.rs +++ b/lightning/src/routing/gossip.rs @@ -40,6 +40,7 @@ use crate::types::string::PrintableString; use crate::util::indexed_map::{ Entry as IndexedMapEntry, IndexedMap, OccupiedEntry as IndexedMapOccupiedEntry, }; +use crate::util::async_poll::{MaybeSend, MaybeSync}; use crate::util::logger::{Level, Logger}; use crate::util::scid_utils::{block_from_scid, scid_from_parts, MAX_SCID_BLOCK}; use crate::util::ser::{MaybeReadable, Readable, ReadableArgs, RequiredWrapper, Writeable, Writer}; @@ -185,7 +186,7 @@ impl FromStr for NodeId { /// Represents the network as nodes and channels between them pub struct NetworkGraph where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { secp_ctx: Secp256k1, last_rapid_gossip_sync_timestamp: Mutex>, @@ -323,8 +324,8 @@ impl MaybeReadable for NetworkUpdate { /// serving historical announcements. pub struct P2PGossipSync>, U: Deref, L: Deref> where + L::Target: Logger + MaybeSend + MaybeSync, U::Target: UtxoLookup, - L::Target: Logger, { network_graph: G, utxo_lookup: RwLock>, @@ -335,8 +336,8 @@ where impl>, U: Deref, L: Deref> P2PGossipSync where + L::Target: Logger + MaybeSend + MaybeSync, U::Target: UtxoLookup, - L::Target: Logger, { /// Creates a new tracker of the actual state of the network of channels and nodes, /// assuming an existing [`NetworkGraph`]. @@ -416,7 +417,7 @@ where impl NetworkGraph where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { /// Handles any network updates originating from [`Event`]s. /// @@ -533,8 +534,8 @@ pub fn verify_channel_announcement( impl>, U: Deref, L: Deref> RoutingMessageHandler for P2PGossipSync where + L::Target: Logger + MaybeSend + MaybeSync, U::Target: UtxoLookup, - L::Target: Logger, { fn handle_node_announcement( &self, _their_node_id: Option, msg: &msgs::NodeAnnouncement, @@ -759,8 +760,8 @@ where impl>, U: Deref, L: Deref> BaseMessageHandler for P2PGossipSync where + L::Target: Logger + MaybeSend + MaybeSync, U::Target: UtxoLookup, - L::Target: Logger, { /// Initiates a stateless sync of routing gossip information with a peer /// using [`gossip_queries`]. The default strategy used by this implementation @@ -1631,7 +1632,7 @@ const MIN_SERIALIZATION_VERSION: u8 = 1; impl Writeable for NetworkGraph where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { fn write(&self, writer: &mut W) -> Result<(), io::Error> { self.test_node_counter_consistency(); @@ -1662,7 +1663,7 @@ where impl ReadableArgs for NetworkGraph where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { fn read(reader: &mut R, logger: L) -> Result, DecodeError> { let _ver = read_ver_prefix!(reader, SERIALIZATION_VERSION); @@ -1719,7 +1720,7 @@ where impl fmt::Display for NetworkGraph where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { writeln!(f, "Network map\n[Channels]")?; @@ -1734,10 +1735,13 @@ where } } -impl Eq for NetworkGraph where L::Target: Logger {} +impl Eq for NetworkGraph +where + L::Target: Logger + MaybeSend + MaybeSync, +{} impl PartialEq for NetworkGraph where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { fn eq(&self, other: &Self) -> bool { // For a total lockorder, sort by position in memory and take the inner locks in that order. @@ -1768,7 +1772,7 @@ const NODE_COUNT_ESTIMATE: usize = 20_000; impl NetworkGraph where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { /// Creates a new, empty, network graph. pub fn new(network: Network, logger: L) -> NetworkGraph { diff --git a/lightning/src/routing/router.rs b/lightning/src/routing/router.rs index 8434b17698d..6ea3505e5ba 100644 --- a/lightning/src/routing/router.rs +++ b/lightning/src/routing/router.rs @@ -34,6 +34,7 @@ use crate::types::features::{ BlindedHopFeatures, Bolt11InvoiceFeatures, Bolt12InvoiceFeatures, ChannelFeatures, NodeFeatures, }; use crate::types::payment::{PaymentHash, PaymentPreimage}; +use crate::util::async_poll::{MaybeSend, MaybeSync}; use crate::util::logger::Logger; use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer}; @@ -63,7 +64,7 @@ pub struct DefaultRouter< SP: Sized, Sc: ScoreLookUp, > where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, S::Target: for<'a> LockableScore<'a, ScoreLookUp = Sc>, ES::Target: EntropySource, { @@ -83,7 +84,7 @@ impl< Sc: ScoreLookUp, > DefaultRouter where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, S::Target: for<'a> LockableScore<'a, ScoreLookUp = Sc>, ES::Target: EntropySource, { @@ -104,7 +105,7 @@ impl< Sc: ScoreLookUp, > Router for DefaultRouter where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, S::Target: for<'a> LockableScore<'a, ScoreLookUp = Sc>, ES::Target: EntropySource, { @@ -2422,7 +2423,10 @@ pub fn find_route( network_graph: &NetworkGraph, first_hops: Option<&[&ChannelDetails]>, logger: L, scorer: &S, score_params: &S::ScoreParams, random_seed_bytes: &[u8; 32] ) -> Result -where L::Target: Logger, GL::Target: Logger { +where + L::Target: Logger + MaybeSend + MaybeSync, + GL::Target: Logger + MaybeSend + MaybeSync, +{ let graph_lock = network_graph.read_only(); let mut route = get_route(our_node_pubkey, &route_params, &graph_lock, first_hops, logger, scorer, score_params, random_seed_bytes)?; @@ -2436,7 +2440,9 @@ pub(crate) fn get_route( first_hops: Option<&[&ChannelDetails]>, logger: L, scorer: &S, score_params: &S::ScoreParams, _random_seed_bytes: &[u8; 32] ) -> Result -where L::Target: Logger { +where + L::Target: Logger + MaybeSend + MaybeSync, +{ let payment_params = &route_params.payment_params; let max_path_length = core::cmp::min(payment_params.max_path_length, MAX_PATH_LENGTH_ESTIMATE); @@ -3824,7 +3830,10 @@ pub fn build_route_from_hops( our_node_pubkey: &PublicKey, hops: &[PublicKey], route_params: &RouteParameters, network_graph: &NetworkGraph, logger: L, random_seed_bytes: &[u8; 32] ) -> Result -where L::Target: Logger, GL::Target: Logger { +where + L::Target: Logger + MaybeSend + MaybeSync, + GL::Target: Logger + MaybeSend + MaybeSync, +{ let graph_lock = network_graph.read_only(); let mut route = build_route_from_hops_internal(our_node_pubkey, hops, &route_params, &graph_lock, logger, random_seed_bytes)?; @@ -3836,7 +3845,10 @@ where L::Target: Logger, GL::Target: Logger { fn build_route_from_hops_internal( our_node_pubkey: &PublicKey, hops: &[PublicKey], route_params: &RouteParameters, network_graph: &ReadOnlyNetworkGraph, logger: L, random_seed_bytes: &[u8; 32], -) -> Result where L::Target: Logger { +) -> Result +where + L::Target: Logger + MaybeSend + MaybeSync, +{ struct HopScorer { our_node_id: NodeId, diff --git a/lightning/src/routing/scoring.rs b/lightning/src/routing/scoring.rs index 6c111ab475b..5e712afaedf 100644 --- a/lightning/src/routing/scoring.rs +++ b/lightning/src/routing/scoring.rs @@ -59,6 +59,7 @@ use crate::routing::gossip::{DirectedChannelInfo, EffectiveCapacity, NetworkGrap use crate::routing::log_approx; use crate::routing::router::{CandidateRouteHop, Path, PublicHopCandidate}; use crate::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; +use crate::util::async_poll::{MaybeSend, MaybeSync}; use crate::util::logger::Logger; use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer}; use bucketed_history::{ @@ -481,7 +482,7 @@ impl ReadableArgs for FixedPenaltyScorer { /// [`historical_liquidity_penalty_amount_multiplier_msat`]: ProbabilisticScoringFeeParameters::historical_liquidity_penalty_amount_multiplier_msat pub struct ProbabilisticScorer>, L: Deref> where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { decay_params: ProbabilisticScoringDecayParameters, network_graph: G, @@ -966,7 +967,7 @@ struct DirectedChannelLiquidity< impl>, L: Deref> ProbabilisticScorer where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { /// Creates a new scorer using the given scoring parameters for sending payments from a node /// through a network graph. @@ -1671,7 +1672,7 @@ impl< impl>, L: Deref> ScoreLookUp for ProbabilisticScorer where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { type ScoreParams = ProbabilisticScoringFeeParameters; #[rustfmt::skip] @@ -1726,7 +1727,7 @@ where impl>, L: Deref> ScoreUpdate for ProbabilisticScorer where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { #[rustfmt::skip] fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) { @@ -1827,7 +1828,7 @@ where /// resupplied. pub struct CombinedScorer>, L: Deref> where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { local_only_scorer: ProbabilisticScorer, scorer: ProbabilisticScorer, @@ -1835,7 +1836,7 @@ where impl> + Clone, L: Deref + Clone> CombinedScorer where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { /// Create a new combined scorer with the given local scorer. #[rustfmt::skip] @@ -1880,7 +1881,7 @@ where impl>, L: Deref> ScoreLookUp for CombinedScorer where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { type ScoreParams = ProbabilisticScoringFeeParameters; @@ -1894,7 +1895,7 @@ where impl>, L: Deref> ScoreUpdate for CombinedScorer where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { fn payment_path_failed( &mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration, @@ -1926,7 +1927,7 @@ where impl>, L: Deref> Writeable for CombinedScorer where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { fn write(&self, writer: &mut W) -> Result<(), crate::io::Error> { self.local_only_scorer.write(writer) @@ -1934,8 +1935,9 @@ where } #[cfg(c_bindings)] -impl>, L: Deref> Score for ProbabilisticScorer where - L::Target: Logger +impl>, L: Deref> Score for ProbabilisticScorer +where + L::Target: Logger + MaybeSend + MaybeSync, { } @@ -2511,7 +2513,7 @@ mod bucketed_history { impl>, L: Deref> Writeable for ProbabilisticScorer where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { #[inline] fn write(&self, w: &mut W) -> Result<(), io::Error> { @@ -2522,7 +2524,7 @@ where impl>, L: Deref> ReadableArgs<(ProbabilisticScoringDecayParameters, G, L)> for ProbabilisticScorer where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { #[inline] #[rustfmt::skip] diff --git a/lightning/src/routing/utxo.rs b/lightning/src/routing/utxo.rs index 4968d6cd7b4..02a2bc86b3d 100644 --- a/lightning/src/routing/utxo.rs +++ b/lightning/src/routing/utxo.rs @@ -22,6 +22,7 @@ use bitcoin::hex::DisplayHex; use crate::ln::chan_utils::make_funding_redeemscript_from_slices; use crate::ln::msgs::{self, ErrorAction, LightningError, MessageSendEvent}; use crate::routing::gossip::{NetworkGraph, NodeId, P2PGossipSync}; +use crate::util::async_poll::{MaybeSend, MaybeSync}; use crate::util::logger::{Level, Logger}; use crate::prelude::*; @@ -161,7 +162,7 @@ impl UtxoFuture { pub fn resolve_without_forwarding( &self, graph: &NetworkGraph, result: Result, ) where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { self.do_resolve(graph, result); } @@ -185,7 +186,7 @@ impl UtxoFuture { >( &self, graph: &NetworkGraph, gossip: GS, result: Result, ) where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, U::Target: UtxoLookup, { let mut res = self.do_resolve(graph, result); @@ -198,7 +199,10 @@ impl UtxoFuture { #[rustfmt::skip] fn do_resolve(&self, graph: &NetworkGraph, result: Result) - -> [Option; 5] where L::Target: Logger { + -> [Option; 5] + where + L::Target: Logger + MaybeSend + MaybeSync, + { let (announcement, node_a, node_b, update_a, update_b) = { let mut pending_checks = graph.pending_checks.internal.lock().unwrap(); let mut async_messages = self.state.lock().unwrap(); From e253c724f3b423c648d8426c4017d6e5e1d42da5 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Mon, 17 Nov 2025 14:28:33 +0100 Subject: [PATCH 3/4] rustfmt --- lightning-background-processor/src/lib.rs | 6 ++---- lightning/src/routing/gossip.rs | 7 ++----- lightning/src/routing/scoring.rs | 5 ++--- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index 9f2fb6b06d0..6fd4f899d5c 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -260,8 +260,7 @@ impl< G, &'a (dyn UtxoLookup + Send + Sync), L, - > -where + > where L::Target: Logger + MaybeSend + MaybeSync, { /// Initializes a new [`GossipSync::Rapid`] variant. @@ -278,8 +277,7 @@ impl<'a, L: Deref> &'a NetworkGraph, &'a (dyn UtxoLookup + Send + Sync), L, - > -where + > where L::Target: Logger + MaybeSend + MaybeSync, { /// Initializes a new [`GossipSync::None`] variant. diff --git a/lightning/src/routing/gossip.rs b/lightning/src/routing/gossip.rs index 81ba46dc533..272ba5bb071 100644 --- a/lightning/src/routing/gossip.rs +++ b/lightning/src/routing/gossip.rs @@ -37,10 +37,10 @@ use crate::ln::types::ChannelId; use crate::routing::utxo::{self, UtxoLookup, UtxoResolver}; use crate::types::features::{ChannelFeatures, InitFeatures, NodeFeatures}; use crate::types::string::PrintableString; +use crate::util::async_poll::{MaybeSend, MaybeSync}; use crate::util::indexed_map::{ Entry as IndexedMapEntry, IndexedMap, OccupiedEntry as IndexedMapOccupiedEntry, }; -use crate::util::async_poll::{MaybeSend, MaybeSync}; use crate::util::logger::{Level, Logger}; use crate::util::scid_utils::{block_from_scid, scid_from_parts, MAX_SCID_BLOCK}; use crate::util::ser::{MaybeReadable, Readable, ReadableArgs, RequiredWrapper, Writeable, Writer}; @@ -1735,10 +1735,7 @@ where } } -impl Eq for NetworkGraph -where - L::Target: Logger + MaybeSend + MaybeSync, -{} +impl Eq for NetworkGraph where L::Target: Logger + MaybeSend + MaybeSync {} impl PartialEq for NetworkGraph where L::Target: Logger + MaybeSend + MaybeSync, diff --git a/lightning/src/routing/scoring.rs b/lightning/src/routing/scoring.rs index 5e712afaedf..8907706e583 100644 --- a/lightning/src/routing/scoring.rs +++ b/lightning/src/routing/scoring.rs @@ -1935,9 +1935,8 @@ where } #[cfg(c_bindings)] -impl>, L: Deref> Score for ProbabilisticScorer -where - L::Target: Logger + MaybeSend + MaybeSync, +impl>, L: Deref> Score for ProbabilisticScorer where + L::Target: Logger + MaybeSend + MaybeSync { } From ddf5cb403c55a7f75b3a992e8601e9dd2aa2b9a5 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Mon, 17 Nov 2025 14:28:17 +0100 Subject: [PATCH 4/4] use dyn logger in LoggerScope --- lightning/src/routing/gossip.rs | 4 +++- lightning/src/util/logger.rs | 9 +++------ lightning/src/util/persist.rs | 3 +-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/lightning/src/routing/gossip.rs b/lightning/src/routing/gossip.rs index 272ba5bb071..e54eefceba7 100644 --- a/lightning/src/routing/gossip.rs +++ b/lightning/src/routing/gossip.rs @@ -41,7 +41,7 @@ use crate::util::async_poll::{MaybeSend, MaybeSync}; use crate::util::indexed_map::{ Entry as IndexedMapEntry, IndexedMap, OccupiedEntry as IndexedMapOccupiedEntry, }; -use crate::util::logger::{Level, Logger}; +use crate::util::logger::{Level, Logger, LoggerScope}; use crate::util::scid_utils::{block_from_scid, scid_from_parts, MAX_SCID_BLOCK}; use crate::util::ser::{MaybeReadable, Readable, ReadableArgs, RequiredWrapper, Writeable, Writer}; @@ -1843,6 +1843,8 @@ where /// The unix timestamp provided by the most recent rapid gossip sync. /// It will be set by the rapid sync process after every sync completion. pub fn get_last_rapid_gossip_sync_timestamp(&self) -> Option { + let _scope = LoggerScope::new(&*self.logger); // DOES NOT WORK. + self.last_rapid_gossip_sync_timestamp.lock().unwrap().clone() } diff --git a/lightning/src/util/logger.rs b/lightning/src/util/logger.rs index 6c7758409f5..ba5f0ca6a2c 100644 --- a/lightning/src/util/logger.rs +++ b/lightning/src/util/logger.rs @@ -271,7 +271,7 @@ pub struct LoggerScope<'a> { } impl<'a> LoggerScope<'a> { - pub fn new(logger: &'a L) -> Self { + pub fn new(logger: &'a dyn Logger) -> Self { TLS_LOGGER.with(|cell| { let mut borrow = cell.borrow_mut(); @@ -280,11 +280,8 @@ impl<'a> LoggerScope<'a> { panic!("LoggerScope already active in this thread"); } - // Transmute is safe in practice because the RAII pattern ensures: - // - The TLS logger reference is only used while the guard exists. - // - The guard cannot outlive the logger (thanks to PhantomData<'a>). - let logger_ref: &dyn Logger = logger; - let logger_ref_static: &'static dyn Logger = unsafe { std::mem::transmute(logger_ref) }; + let logger_ref_static: &'static dyn Logger = + unsafe { std::mem::transmute::<&'a dyn Logger, &'static dyn Logger>(logger) }; *borrow = Some(logger_ref_static); }); diff --git a/lightning/src/util/persist.rs b/lightning/src/util/persist.rs index c97cea475f4..d00e29e686a 100644 --- a/lightning/src/util/persist.rs +++ b/lightning/src/util/persist.rs @@ -35,7 +35,7 @@ use crate::ln::types::ChannelId; use crate::sign::{ecdsa::EcdsaChannelSigner, EntropySource, SignerProvider}; use crate::sync::Mutex; use crate::util::async_poll::{dummy_waker, AsyncResult, MaybeSend, MaybeSync}; -use crate::util::logger::{Logger, LoggerScope}; +use crate::util::logger::Logger; use crate::util::native_async::FutureSpawner; use crate::util::ser::{Readable, ReadableArgs, Writeable}; use crate::util::wakers::Notifier; @@ -1063,7 +1063,6 @@ where Err(err) => return Err(err), }; - // let _scope = LoggerScope::new(&*self.logger); // DOES NOT WORK monitor .update_monitor(&update, &self.broadcaster, &self.fee_estimator, &self.logger) .map_err(|e| {