diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index 19333c5823a..6fd4f899d5c 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 { @@ -260,7 +261,7 @@ impl< &'a (dyn UtxoLookup + Send + Sync), L, > where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { /// Initializes a new [`GossipSync::Rapid`] variant. pub fn rapid(gossip_sync: R) -> Self { @@ -277,7 +278,7 @@ impl<'a, L: Deref> &'a (dyn UtxoLookup + Send + Sync), L, > where - L::Target: Logger, + L::Target: Logger + MaybeSend + MaybeSync, { /// Initializes a new [`GossipSync::None`] variant. pub fn none() -> Self { @@ -287,7 +288,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 +912,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 +1383,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 +1501,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/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/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..e54eefceba7 100644 --- a/lightning/src/routing/gossip.rs +++ b/lightning/src/routing/gossip.rs @@ -37,10 +37,11 @@ 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::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}; @@ -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,10 @@ 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 +1769,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 { @@ -1842,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/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..8907706e583 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) @@ -1935,7 +1936,7 @@ where #[cfg(c_bindings)] impl>, L: Deref> Score for ProbabilisticScorer where - L::Target: Logger + L::Target: Logger + MaybeSend + MaybeSync { } @@ -2511,7 +2512,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 +2523,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(); diff --git a/lightning/src/util/logger.rs b/lightning/src/util/logger.rs index 283d3158144..ba5f0ca6a2c 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,57 @@ 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 dyn Logger) -> 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"); + } + + let logger_ref_static: &'static dyn Logger = + unsafe { std::mem::transmute::<&'a dyn Logger, &'static dyn Logger>(logger) }; + + *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 {