@@ -1064,7 +1064,10 @@ impl<T: Time> ChannelLiquidity<T> {
10641064 }
10651065 }
10661066
1067- fn decayed_offset ( & self , offset : u64 , decay_params : ProbabilisticScoringDecayParameters ) -> u64 {
1067+ fn decayed_offset (
1068+ & self , offset : u64 , duration_since_epoch : Duration ,
1069+ decay_params : ProbabilisticScoringDecayParameters ,
1070+ ) -> u64 {
10681071 let half_life = decay_params. liquidity_offset_half_life . as_secs_f64 ( ) ;
10691072 if half_life != 0.0 {
10701073 let elapsed_time = T :: now ( ) . duration_since ( self . last_updated ) . as_secs_f64 ( ) ;
@@ -1266,44 +1269,50 @@ impl<L: Deref<Target = u64>, BRT: Deref<Target = HistoricalBucketRangeTracker>,
12661269
12671270impl < L : DerefMut < Target = u64 > , BRT : DerefMut < Target = HistoricalBucketRangeTracker > , T : Time , U : DerefMut < Target = T > > DirectedChannelLiquidity < L , BRT , T , U > {
12681271 /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat`.
1269- fn failed_at_channel < Log : Deref > ( & mut self , amount_msat : u64 , chan_descr : fmt:: Arguments , logger : & Log ) where Log :: Target : Logger {
1272+ fn failed_at_channel < Log : Deref > (
1273+ & mut self , amount_msat : u64 , duration_since_epoch : Duration , chan_descr : fmt:: Arguments , logger : & Log
1274+ ) where Log :: Target : Logger {
12701275 let existing_max_msat = self . max_liquidity_msat ( ) ;
12711276 if amount_msat < existing_max_msat {
12721277 log_debug ! ( logger, "Setting max liquidity of {} from {} to {}" , chan_descr, existing_max_msat, amount_msat) ;
1273- self . set_max_liquidity_msat ( amount_msat) ;
1278+ self . set_max_liquidity_msat ( amount_msat, duration_since_epoch ) ;
12741279 } else {
12751280 log_trace ! ( logger, "Max liquidity of {} is {} (already less than or equal to {})" ,
12761281 chan_descr, existing_max_msat, amount_msat) ;
12771282 }
1278- self . update_history_buckets ( 0 ) ;
1283+ self . update_history_buckets ( 0 , duration_since_epoch ) ;
12791284 }
12801285
12811286 /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat` downstream.
1282- fn failed_downstream < Log : Deref > ( & mut self , amount_msat : u64 , chan_descr : fmt:: Arguments , logger : & Log ) where Log :: Target : Logger {
1287+ fn failed_downstream < Log : Deref > (
1288+ & mut self , amount_msat : u64 , duration_since_epoch : Duration , chan_descr : fmt:: Arguments , logger : & Log
1289+ ) where Log :: Target : Logger {
12831290 let existing_min_msat = self . min_liquidity_msat ( ) ;
12841291 if amount_msat > existing_min_msat {
12851292 log_debug ! ( logger, "Setting min liquidity of {} from {} to {}" , existing_min_msat, chan_descr, amount_msat) ;
1286- self . set_min_liquidity_msat ( amount_msat) ;
1293+ self . set_min_liquidity_msat ( amount_msat, duration_since_epoch ) ;
12871294 } else {
12881295 log_trace ! ( logger, "Min liquidity of {} is {} (already greater than or equal to {})" ,
12891296 chan_descr, existing_min_msat, amount_msat) ;
12901297 }
1291- self . update_history_buckets ( 0 ) ;
1298+ self . update_history_buckets ( 0 , duration_since_epoch ) ;
12921299 }
12931300
12941301 /// Adjusts the channel liquidity balance bounds when successfully routing `amount_msat`.
1295- fn successful < Log : Deref > ( & mut self , amount_msat : u64 , chan_descr : fmt:: Arguments , logger : & Log ) where Log :: Target : Logger {
1302+ fn successful < Log : Deref > ( & mut self ,
1303+ amount_msat : u64 , duration_since_epoch : Duration , chan_descr : fmt:: Arguments , logger : & Log
1304+ ) where Log :: Target : Logger {
12961305 let max_liquidity_msat = self . max_liquidity_msat ( ) . checked_sub ( amount_msat) . unwrap_or ( 0 ) ;
12971306 log_debug ! ( logger, "Subtracting {} from max liquidity of {} (setting it to {})" , amount_msat, chan_descr, max_liquidity_msat) ;
1298- self . set_max_liquidity_msat ( max_liquidity_msat) ;
1299- self . update_history_buckets ( amount_msat) ;
1307+ self . set_max_liquidity_msat ( max_liquidity_msat, duration_since_epoch ) ;
1308+ self . update_history_buckets ( amount_msat, duration_since_epoch ) ;
13001309 }
13011310
13021311 /// Updates the history buckets for this channel. Because the history buckets track what we now
13031312 /// know about the channel's state *prior to our payment* (i.e. what we assume is "steady
13041313 /// state"), we allow the caller to set an offset applied to our liquidity bounds which
13051314 /// represents the amount of the successful payment we just made.
1306- fn update_history_buckets ( & mut self , bucket_offset_msat : u64 ) {
1315+ fn update_history_buckets ( & mut self , bucket_offset_msat : u64 , duration_since_epoch : Duration ) {
13071316 let half_lives = self . now . duration_since ( * self . offset_history_last_updated ) . as_secs ( )
13081317 . checked_div ( self . decay_params . historical_no_updates_half_life . as_secs ( ) )
13091318 . map ( |v| v. try_into ( ) . unwrap_or ( u32:: max_value ( ) ) ) . unwrap_or ( u32:: max_value ( ) ) ;
@@ -1322,7 +1331,7 @@ impl<L: DerefMut<Target = u64>, BRT: DerefMut<Target = HistoricalBucketRangeTrac
13221331 }
13231332
13241333 /// Adjusts the lower bound of the channel liquidity balance in this direction.
1325- fn set_min_liquidity_msat ( & mut self , amount_msat : u64 ) {
1334+ fn set_min_liquidity_msat ( & mut self , amount_msat : u64 , duration_since_epoch : Duration ) {
13261335 * self . min_liquidity_offset_msat = amount_msat;
13271336 * self . max_liquidity_offset_msat = if amount_msat > self . max_liquidity_msat ( ) {
13281337 0
@@ -1333,7 +1342,7 @@ impl<L: DerefMut<Target = u64>, BRT: DerefMut<Target = HistoricalBucketRangeTrac
13331342 }
13341343
13351344 /// Adjusts the upper bound of the channel liquidity balance in this direction.
1336- fn set_max_liquidity_msat ( & mut self , amount_msat : u64 ) {
1345+ fn set_max_liquidity_msat ( & mut self , amount_msat : u64 , duration_since_epoch : Duration ) {
13371346 * self . max_liquidity_offset_msat = self . capacity_msat . checked_sub ( amount_msat) . unwrap_or ( 0 ) ;
13381347 * self . min_liquidity_offset_msat = if amount_msat < self . min_liquidity_msat ( ) {
13391348 0
@@ -1396,7 +1405,7 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreLookUp for Prob
13961405}
13971406
13981407impl < G : Deref < Target = NetworkGraph < L > > , L : Deref , T : Time > ScoreUpdate for ProbabilisticScorerUsingTime < G , L , T > where L :: Target : Logger {
1399- fn payment_path_failed ( & mut self , path : & Path , short_channel_id : u64 , _duration_since_epoch : Duration ) {
1408+ fn payment_path_failed ( & mut self , path : & Path , short_channel_id : u64 , duration_since_epoch : Duration ) {
14001409 let amount_msat = path. final_value_msat ( ) ;
14011410 log_trace ! ( self . logger, "Scoring path through to SCID {} as having failed at {} msat" , short_channel_id, amount_msat) ;
14021411 let network_graph = self . network_graph . read_only ( ) ;
@@ -1419,13 +1428,15 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreUpdate for Prob
14191428 . entry ( hop. short_channel_id )
14201429 . or_insert_with ( ChannelLiquidity :: new)
14211430 . as_directed_mut ( source, & target, capacity_msat, self . decay_params )
1422- . failed_at_channel ( amount_msat, format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
1431+ . failed_at_channel ( amount_msat, duration_since_epoch,
1432+ format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
14231433 } else {
14241434 self . channel_liquidities
14251435 . entry ( hop. short_channel_id )
14261436 . or_insert_with ( ChannelLiquidity :: new)
14271437 . as_directed_mut ( source, & target, capacity_msat, self . decay_params )
1428- . failed_downstream ( amount_msat, format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
1438+ . failed_downstream ( amount_msat, duration_since_epoch,
1439+ format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
14291440 }
14301441 } else {
14311442 log_debug ! ( self . logger, "Not able to penalize channel with SCID {} as we do not have graph info for it (likely a route-hint last-hop)." ,
@@ -1435,7 +1446,7 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreUpdate for Prob
14351446 }
14361447 }
14371448
1438- fn payment_path_successful ( & mut self , path : & Path , _duration_since_epoch : Duration ) {
1449+ fn payment_path_successful ( & mut self , path : & Path , duration_since_epoch : Duration ) {
14391450 let amount_msat = path. final_value_msat ( ) ;
14401451 log_trace ! ( self . logger, "Scoring path through SCID {} as having succeeded at {} msat." ,
14411452 path. hops. split_last( ) . map( |( hop, _) | hop. short_channel_id) . unwrap_or( 0 ) , amount_msat) ;
@@ -1453,7 +1464,8 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreUpdate for Prob
14531464 . entry ( hop. short_channel_id )
14541465 . or_insert_with ( ChannelLiquidity :: new)
14551466 . as_directed_mut ( source, & target, capacity_msat, self . decay_params )
1456- . successful ( amount_msat, format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
1467+ . successful ( amount_msat, duration_since_epoch,
1468+ format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
14571469 } else {
14581470 log_debug ! ( self . logger, "Not able to learn for channel with SCID {} as we do not have graph info for it (likely a route-hint last-hop)." ,
14591471 hop. short_channel_id) ;
@@ -1469,12 +1481,15 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreUpdate for Prob
14691481 self . payment_path_failed ( path, u64:: max_value ( ) , duration_since_epoch)
14701482 }
14711483
1472- fn time_passed ( & mut self , _duration_since_epoch : Duration ) {
1484+ fn time_passed ( & mut self , duration_since_epoch : Duration ) {
14731485 let decay_params = self . decay_params ;
14741486 self . channel_liquidities . retain ( |_scid, liquidity| {
1475- liquidity. min_liquidity_offset_msat = liquidity. decayed_offset ( liquidity. min_liquidity_offset_msat , decay_params) ;
1476- liquidity. max_liquidity_offset_msat = liquidity. decayed_offset ( liquidity. max_liquidity_offset_msat , decay_params) ;
1487+ liquidity. min_liquidity_offset_msat =
1488+ liquidity. decayed_offset ( liquidity. min_liquidity_offset_msat , duration_since_epoch, decay_params) ;
1489+ liquidity. max_liquidity_offset_msat =
1490+ liquidity. decayed_offset ( liquidity. max_liquidity_offset_msat , duration_since_epoch, decay_params) ;
14771491 liquidity. last_updated = T :: now ( ) ;
1492+
14781493 let elapsed_time =
14791494 T :: now ( ) . duration_since ( liquidity. offset_history_last_updated ) ;
14801495 if elapsed_time > decay_params. historical_no_updates_half_life {
@@ -2408,7 +2423,7 @@ mod tests {
24082423
24092424 scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
24102425 . as_directed_mut ( & source, & target, 1_000 , decay_params)
2411- . set_min_liquidity_msat ( 200 ) ;
2426+ . set_min_liquidity_msat ( 200 , Duration :: ZERO ) ;
24122427
24132428 let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
24142429 . as_directed ( & source, & target, 1_000 , decay_params) ;
@@ -2434,7 +2449,7 @@ mod tests {
24342449
24352450 scorer. channel_liquidities . get_mut ( & 43 ) . unwrap ( )
24362451 . as_directed_mut ( & target, & recipient, 1_000 , decay_params)
2437- . set_max_liquidity_msat ( 200 ) ;
2452+ . set_max_liquidity_msat ( 200 , Duration :: ZERO ) ;
24382453
24392454 let liquidity = scorer. channel_liquidities . get ( & 43 ) . unwrap ( )
24402455 . as_directed ( & target, & recipient, 1_000 , decay_params) ;
@@ -2480,7 +2495,7 @@ mod tests {
24802495 // Reset from source to target.
24812496 scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
24822497 . as_directed_mut ( & source, & target, 1_000 , decay_params)
2483- . set_min_liquidity_msat ( 900 ) ;
2498+ . set_min_liquidity_msat ( 900 , Duration :: ZERO ) ;
24842499
24852500 let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
24862501 . as_directed ( & source, & target, 1_000 , decay_params) ;
@@ -2495,7 +2510,7 @@ mod tests {
24952510 // Reset from target to source.
24962511 scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
24972512 . as_directed_mut ( & target, & source, 1_000 , decay_params)
2498- . set_min_liquidity_msat ( 400 ) ;
2513+ . set_min_liquidity_msat ( 400 , Duration :: ZERO ) ;
24992514
25002515 let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
25012516 . as_directed ( & source, & target, 1_000 , decay_params) ;
@@ -2541,7 +2556,7 @@ mod tests {
25412556 // Reset from source to target.
25422557 scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
25432558 . as_directed_mut ( & source, & target, 1_000 , decay_params)
2544- . set_max_liquidity_msat ( 300 ) ;
2559+ . set_max_liquidity_msat ( 300 , Duration :: ZERO ) ;
25452560
25462561 let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
25472562 . as_directed ( & source, & target, 1_000 , decay_params) ;
@@ -2556,7 +2571,7 @@ mod tests {
25562571 // Reset from target to source.
25572572 scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
25582573 . as_directed_mut ( & target, & source, 1_000 , decay_params)
2559- . set_max_liquidity_msat ( 600 ) ;
2574+ . set_max_liquidity_msat ( 600 , Duration :: ZERO ) ;
25602575
25612576 let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
25622577 . as_directed ( & source, & target, 1_000 , decay_params) ;
0 commit comments