@@ -36,8 +36,10 @@ use lightning::onion_message::messenger::AOnionMessenger;
36
36
use lightning:: routing:: gossip:: { NetworkGraph , P2PGossipSync } ;
37
37
use lightning:: routing:: scoring:: { ScoreUpdate , WriteableScore } ;
38
38
use lightning:: routing:: utxo:: UtxoLookup ;
39
+ use lightning:: sign:: { ChangeDestinationSource , OutputSpender } ;
39
40
use lightning:: util:: logger:: Logger ;
40
- use lightning:: util:: persist:: Persister ;
41
+ use lightning:: util:: persist:: { KVStore , Persister } ;
42
+ use lightning:: util:: sweep:: OutputSweeper ;
41
43
#[ cfg( feature = "std" ) ]
42
44
use lightning:: util:: wakers:: Sleeper ;
43
45
use lightning_rapid_gossip_sync:: RapidGossipSync ;
@@ -130,6 +132,11 @@ const REBROADCAST_TIMER: u64 = 30;
130
132
#[ cfg( test) ]
131
133
const REBROADCAST_TIMER : u64 = 1 ;
132
134
135
+ #[ cfg( not( test) ) ]
136
+ const SWEEPER_TIMER : u64 = 30 ;
137
+ #[ cfg( test) ]
138
+ const SWEEPER_TIMER : u64 = 1 ;
139
+
133
140
#[ cfg( feature = "futures" ) ]
134
141
/// core::cmp::min is not currently const, so we define a trivial (and equivalent) replacement
135
142
const fn min_u64 ( a : u64 , b : u64 ) -> u64 {
@@ -306,6 +313,7 @@ macro_rules! define_run_body {
306
313
$channel_manager: ident, $process_channel_manager_events: expr,
307
314
$onion_messenger: ident, $process_onion_message_handler_events: expr,
308
315
$peer_manager: ident, $gossip_sync: ident,
316
+ $sweeper: ident,
309
317
$logger: ident, $scorer: ident, $loop_exit_check: expr, $await: expr, $get_timer: expr,
310
318
$timer_elapsed: expr, $check_slow_await: expr, $time_fetch: expr,
311
319
) => { {
@@ -320,6 +328,7 @@ macro_rules! define_run_body {
320
328
let mut last_prune_call = $get_timer( FIRST_NETWORK_PRUNE_TIMER ) ;
321
329
let mut last_scorer_persist_call = $get_timer( SCORER_PERSIST_TIMER ) ;
322
330
let mut last_rebroadcast_call = $get_timer( REBROADCAST_TIMER ) ;
331
+ let mut last_sweeper_call = $get_timer( SWEEPER_TIMER ) ;
323
332
let mut have_pruned = false ;
324
333
let mut have_decayed_scorer = false ;
325
334
@@ -461,6 +470,12 @@ macro_rules! define_run_body {
461
470
$chain_monitor. rebroadcast_pending_claims( ) ;
462
471
last_rebroadcast_call = $get_timer( REBROADCAST_TIMER ) ;
463
472
}
473
+
474
+ if $timer_elapsed( & mut last_sweeper_call, SWEEPER_TIMER ) {
475
+ log_trace!( $logger, "Regenerate sweeper spends if necessary" ) ;
476
+ let _ = $sweeper. regenerate_and_broadcast_spend_if_necessary_locked( ) ;
477
+ last_sweeper_call = $get_timer( SWEEPER_TIMER ) ;
478
+ }
464
479
}
465
480
466
481
// After we exit, ensure we persist the ChannelManager one final time - this avoids
@@ -922,14 +937,18 @@ impl BackgroundProcessor {
922
937
PM : ' static + Deref + Send + Sync ,
923
938
S : ' static + Deref < Target = SC > + Send + Sync ,
924
939
SC : for < ' b > WriteableScore < ' b > ,
940
+ D : ' static + Deref + Send + Sync ,
941
+ O : ' static + Deref + Send + Sync ,
942
+ K : ' static + Deref + Send + Sync ,
943
+ OS : ' static + Deref < Target = OutputSweeper < T , D , F , CF , K , L , O > > + Send + Sync ,
925
944
> (
926
945
persister : PS , event_handler : EH , chain_monitor : M , channel_manager : CM ,
927
946
onion_messenger : Option < OM > , gossip_sync : GossipSync < PGS , RGS , G , UL , L > , peer_manager : PM ,
928
- logger : L , scorer : Option < S > ,
947
+ sweeper : OS , logger : L , scorer : Option < S > ,
929
948
) -> Self
930
949
where
931
950
UL :: Target : ' static + UtxoLookup ,
932
- CF :: Target : ' static + chain:: Filter ,
951
+ CF :: Target : ' static + chain:: Filter + Sync + Send ,
933
952
T :: Target : ' static + BroadcasterInterface ,
934
953
F :: Target : ' static + FeeEstimator ,
935
954
L :: Target : ' static + Logger ,
@@ -938,6 +957,9 @@ impl BackgroundProcessor {
938
957
CM :: Target : AChannelManager + Send + Sync ,
939
958
OM :: Target : AOnionMessenger + Send + Sync ,
940
959
PM :: Target : APeerManager + Send + Sync ,
960
+ O :: Target : ' static + OutputSpender + Send + Sync ,
961
+ D :: Target : ' static + ChangeDestinationSource + Send + Sync ,
962
+ K :: Target : ' static + KVStore + Send + Sync ,
941
963
{
942
964
let stop_thread = Arc :: new ( AtomicBool :: new ( false ) ) ;
943
965
let stop_thread_clone = stop_thread. clone ( ) ;
@@ -973,6 +995,7 @@ impl BackgroundProcessor {
973
995
} ,
974
996
peer_manager,
975
997
gossip_sync,
998
+ sweeper,
976
999
logger,
977
1000
scorer,
978
1001
stop_thread. load( Ordering :: Acquire ) ,
@@ -1069,7 +1092,7 @@ mod tests {
1069
1092
use core:: sync:: atomic:: { AtomicBool , Ordering } ;
1070
1093
use lightning:: chain:: channelmonitor:: ANTI_REORG_DELAY ;
1071
1094
use lightning:: chain:: transaction:: OutPoint ;
1072
- use lightning:: chain:: { chainmonitor, BestBlock , Confirm , Filter } ;
1095
+ use lightning:: chain:: { self , chainmonitor, BestBlock , Confirm , Filter } ;
1073
1096
use lightning:: events:: { Event , PathFailure , ReplayEvent } ;
1074
1097
use lightning:: ln:: channelmanager;
1075
1098
use lightning:: ln:: channelmanager:: {
@@ -1085,6 +1108,7 @@ mod tests {
1085
1108
use lightning:: routing:: gossip:: { NetworkGraph , P2PGossipSync } ;
1086
1109
use lightning:: routing:: router:: { CandidateRouteHop , DefaultRouter , Path , RouteHop } ;
1087
1110
use lightning:: routing:: scoring:: { ChannelUsage , LockableScore , ScoreLookUp , ScoreUpdate } ;
1111
+ use lightning:: routing:: utxo:: UtxoLookup ;
1088
1112
use lightning:: sign:: { ChangeDestinationSource , InMemorySigner , KeysManager } ;
1089
1113
use lightning:: types:: features:: { ChannelFeatures , NodeFeatures } ;
1090
1114
use lightning:: types:: payment:: PaymentHash ;
@@ -1155,7 +1179,7 @@ mod tests {
1155
1179
1156
1180
type ChainMonitor = chainmonitor:: ChainMonitor <
1157
1181
InMemorySigner ,
1158
- Arc < test_utils :: TestChainSource > ,
1182
+ Arc < dyn chain :: Filter + Sync + Send > ,
1159
1183
Arc < test_utils:: TestBroadcaster > ,
1160
1184
Arc < test_utils:: TestFeeEstimator > ,
1161
1185
Arc < test_utils:: TestLogger > ,
@@ -1558,12 +1582,13 @@ mod tests {
1558
1582
Arc :: clone ( & keys_manager) ,
1559
1583
) ) ;
1560
1584
let chain_source = Arc :: new ( test_utils:: TestChainSource :: new ( Network :: Bitcoin ) ) ;
1585
+ let x: Arc < dyn Filter + Send + Sync > = chain_source. clone ( ) ;
1561
1586
let kv_store =
1562
1587
Arc :: new ( FilesystemStore :: new ( format ! ( "{}_persister_{}" , & persist_dir, i) . into ( ) ) ) ;
1563
1588
let now = Duration :: from_secs ( genesis_block. header . time as u64 ) ;
1564
1589
let keys_manager = Arc :: new ( KeysManager :: new ( & seed, now. as_secs ( ) , now. subsec_nanos ( ) ) ) ;
1565
1590
let chain_monitor = Arc :: new ( chainmonitor:: ChainMonitor :: new (
1566
- Some ( chain_source . clone ( ) ) ,
1591
+ Some ( x . clone ( ) ) ,
1567
1592
tx_broadcaster. clone ( ) ,
1568
1593
logger. clone ( ) ,
1569
1594
fee_estimator. clone ( ) ,
@@ -1823,6 +1848,7 @@ mod tests {
1823
1848
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
1824
1849
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
1825
1850
let event_handler = |_: _ | Ok ( ( ) ) ;
1851
+
1826
1852
let bg_processor = BackgroundProcessor :: start (
1827
1853
persister,
1828
1854
event_handler,
@@ -1831,6 +1857,7 @@ mod tests {
1831
1857
Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
1832
1858
nodes[ 0 ] . p2p_gossip_sync ( ) ,
1833
1859
nodes[ 0 ] . peer_manager . clone ( ) ,
1860
+ nodes[ 0 ] . sweeper . clone ( ) ,
1834
1861
nodes[ 0 ] . logger . clone ( ) ,
1835
1862
Some ( nodes[ 0 ] . scorer . clone ( ) ) ,
1836
1863
) ;
@@ -1924,6 +1951,7 @@ mod tests {
1924
1951
Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
1925
1952
nodes[ 0 ] . no_gossip_sync ( ) ,
1926
1953
nodes[ 0 ] . peer_manager . clone ( ) ,
1954
+ nodes[ 0 ] . sweeper . clone ( ) ,
1927
1955
nodes[ 0 ] . logger . clone ( ) ,
1928
1956
Some ( nodes[ 0 ] . scorer . clone ( ) ) ,
1929
1957
) ;
@@ -1966,6 +1994,7 @@ mod tests {
1966
1994
Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
1967
1995
nodes[ 0 ] . no_gossip_sync ( ) ,
1968
1996
nodes[ 0 ] . peer_manager . clone ( ) ,
1997
+ nodes[ 0 ] . sweeper . clone ( ) ,
1969
1998
nodes[ 0 ] . logger . clone ( ) ,
1970
1999
Some ( nodes[ 0 ] . scorer . clone ( ) ) ,
1971
2000
) ;
@@ -2034,6 +2063,7 @@ mod tests {
2034
2063
Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
2035
2064
nodes[ 0 ] . p2p_gossip_sync ( ) ,
2036
2065
nodes[ 0 ] . peer_manager . clone ( ) ,
2066
+ nodes[ 0 ] . sweeper . clone ( ) ,
2037
2067
nodes[ 0 ] . logger . clone ( ) ,
2038
2068
Some ( nodes[ 0 ] . scorer . clone ( ) ) ,
2039
2069
) ;
@@ -2063,6 +2093,7 @@ mod tests {
2063
2093
Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
2064
2094
nodes[ 0 ] . no_gossip_sync ( ) ,
2065
2095
nodes[ 0 ] . peer_manager . clone ( ) ,
2096
+ nodes[ 0 ] . sweeper . clone ( ) ,
2066
2097
nodes[ 0 ] . logger . clone ( ) ,
2067
2098
Some ( nodes[ 0 ] . scorer . clone ( ) ) ,
2068
2099
) ;
@@ -2109,6 +2140,7 @@ mod tests {
2109
2140
Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
2110
2141
nodes[ 0 ] . no_gossip_sync ( ) ,
2111
2142
nodes[ 0 ] . peer_manager . clone ( ) ,
2143
+ nodes[ 0 ] . sweeper . clone ( ) ,
2112
2144
nodes[ 0 ] . logger . clone ( ) ,
2113
2145
Some ( nodes[ 0 ] . scorer . clone ( ) ) ,
2114
2146
) ;
@@ -2171,6 +2203,7 @@ mod tests {
2171
2203
Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
2172
2204
nodes[ 0 ] . no_gossip_sync ( ) ,
2173
2205
nodes[ 0 ] . peer_manager . clone ( ) ,
2206
+ nodes[ 0 ] . sweeper . clone ( ) ,
2174
2207
nodes[ 0 ] . logger . clone ( ) ,
2175
2208
Some ( nodes[ 0 ] . scorer . clone ( ) ) ,
2176
2209
) ;
@@ -2322,6 +2355,7 @@ mod tests {
2322
2355
Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
2323
2356
nodes[ 0 ] . no_gossip_sync ( ) ,
2324
2357
nodes[ 0 ] . peer_manager . clone ( ) ,
2358
+ nodes[ 0 ] . sweeper . clone ( ) ,
2325
2359
nodes[ 0 ] . logger . clone ( ) ,
2326
2360
Some ( nodes[ 0 ] . scorer . clone ( ) ) ,
2327
2361
) ;
@@ -2351,6 +2385,7 @@ mod tests {
2351
2385
Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
2352
2386
nodes[ 0 ] . no_gossip_sync ( ) ,
2353
2387
nodes[ 0 ] . peer_manager . clone ( ) ,
2388
+ nodes[ 0 ] . sweeper . clone ( ) ,
2354
2389
nodes[ 0 ] . logger . clone ( ) ,
2355
2390
Some ( nodes[ 0 ] . scorer . clone ( ) ) ,
2356
2391
) ;
@@ -2446,6 +2481,7 @@ mod tests {
2446
2481
Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
2447
2482
nodes[ 0 ] . rapid_gossip_sync ( ) ,
2448
2483
nodes[ 0 ] . peer_manager . clone ( ) ,
2484
+ nodes[ 0 ] . sweeper . clone ( ) ,
2449
2485
nodes[ 0 ] . logger . clone ( ) ,
2450
2486
Some ( nodes[ 0 ] . scorer . clone ( ) ) ,
2451
2487
) ;
@@ -2640,6 +2676,7 @@ mod tests {
2640
2676
Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
2641
2677
nodes[ 0 ] . no_gossip_sync ( ) ,
2642
2678
nodes[ 0 ] . peer_manager . clone ( ) ,
2679
+ nodes[ 0 ] . sweeper . clone ( ) ,
2643
2680
nodes[ 0 ] . logger . clone ( ) ,
2644
2681
Some ( nodes[ 0 ] . scorer . clone ( ) ) ,
2645
2682
) ;
0 commit comments