@@ -1065,7 +1065,9 @@ impl<T: Time> ChannelLiquidity<T> {
10651065 }
10661066 }
10671067
1068- fn decayed_offset ( & self , offset : u64 , decay_params : ProbabilisticScoringDecayParameters ) -> u64 {
1068+ fn decayed_offset ( & self , offset : u64 , duration_since_epoch : Duration ,
1069+ decay_params : ProbabilisticScoringDecayParameters
1070+ ) -> u64 {
10691071 let half_life = decay_params. liquidity_offset_half_life . as_secs ( ) ;
10701072 if half_life != 0 {
10711073 let elapsed_time = T :: now ( ) . duration_since ( self . last_updated ) . as_secs ( ) as f64 ;
@@ -1267,44 +1269,50 @@ impl<L: Deref<Target = u64>, BRT: Deref<Target = HistoricalBucketRangeTracker>,
12671269
12681270impl < L : DerefMut < Target = u64 > , BRT : DerefMut < Target = HistoricalBucketRangeTracker > , T : Time , U : DerefMut < Target = T > > DirectedChannelLiquidity < L , BRT , T , U > {
12691271 /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat`.
1270- 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 {
12711275 let existing_max_msat = self . max_liquidity_msat ( ) ;
12721276 if amount_msat < existing_max_msat {
12731277 log_debug ! ( logger, "Setting max liquidity of {} from {} to {}" , chan_descr, existing_max_msat, amount_msat) ;
1274- self . set_max_liquidity_msat ( amount_msat) ;
1278+ self . set_max_liquidity_msat ( amount_msat, duration_since_epoch ) ;
12751279 } else {
12761280 log_trace ! ( logger, "Max liquidity of {} is {} (already less than or equal to {})" ,
12771281 chan_descr, existing_max_msat, amount_msat) ;
12781282 }
1279- self . update_history_buckets ( 0 ) ;
1283+ self . update_history_buckets ( 0 , duration_since_epoch ) ;
12801284 }
12811285
12821286 /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat` downstream.
1283- 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 {
12841290 let existing_min_msat = self . min_liquidity_msat ( ) ;
12851291 if amount_msat > existing_min_msat {
12861292 log_debug ! ( logger, "Setting min liquidity of {} from {} to {}" , existing_min_msat, chan_descr, amount_msat) ;
1287- self . set_min_liquidity_msat ( amount_msat) ;
1293+ self . set_min_liquidity_msat ( amount_msat, duration_since_epoch ) ;
12881294 } else {
12891295 log_trace ! ( logger, "Min liquidity of {} is {} (already greater than or equal to {})" ,
12901296 chan_descr, existing_min_msat, amount_msat) ;
12911297 }
1292- self . update_history_buckets ( 0 ) ;
1298+ self . update_history_buckets ( 0 , duration_since_epoch ) ;
12931299 }
12941300
12951301 /// Adjusts the channel liquidity balance bounds when successfully routing `amount_msat`.
1296- 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 {
12971305 let max_liquidity_msat = self . max_liquidity_msat ( ) . checked_sub ( amount_msat) . unwrap_or ( 0 ) ;
12981306 log_debug ! ( logger, "Subtracting {} from max liquidity of {} (setting it to {})" , amount_msat, chan_descr, max_liquidity_msat) ;
1299- self . set_max_liquidity_msat ( max_liquidity_msat) ;
1300- 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 ) ;
13011309 }
13021310
13031311 /// Updates the history buckets for this channel. Because the history buckets track what we now
13041312 /// know about the channel's state *prior to our payment* (i.e. what we assume is "steady
13051313 /// state"), we allow the caller to set an offset applied to our liquidity bounds which
13061314 /// represents the amount of the successful payment we just made.
1307- 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 ) {
13081316 let half_lives = self . now . duration_since ( * self . offset_history_last_updated ) . as_secs ( )
13091317 . checked_div ( self . decay_params . historical_no_updates_half_life . as_secs ( ) )
13101318 . map ( |v| v. try_into ( ) . unwrap_or ( u32:: max_value ( ) ) ) . unwrap_or ( u32:: max_value ( ) ) ;
@@ -1322,7 +1330,7 @@ impl<L: DerefMut<Target = u64>, BRT: DerefMut<Target = HistoricalBucketRangeTrac
13221330 }
13231331
13241332 /// Adjusts the lower bound of the channel liquidity balance in this direction.
1325- fn set_min_liquidity_msat ( & mut self , amount_msat : u64 ) {
1333+ fn set_min_liquidity_msat ( & mut self , amount_msat : u64 , duration_since_epoch : Duration ) {
13261334 * self . min_liquidity_offset_msat = amount_msat;
13271335 * self . max_liquidity_offset_msat = if amount_msat > self . max_liquidity_msat ( ) {
13281336 0
@@ -1334,7 +1342,7 @@ impl<L: DerefMut<Target = u64>, BRT: DerefMut<Target = HistoricalBucketRangeTrac
13341342 }
13351343
13361344 /// Adjusts the upper bound of the channel liquidity balance in this direction.
1337- 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 ) {
13381346 * self . max_liquidity_offset_msat = self . capacity_msat . checked_sub ( amount_msat) . unwrap_or ( 0 ) ;
13391347 * self . min_liquidity_offset_msat = if amount_msat < self . min_liquidity_msat ( ) {
13401348 0
@@ -1391,7 +1399,7 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreLookUp for Prob
13911399}
13921400
13931401impl < G : Deref < Target = NetworkGraph < L > > , L : Deref , T : Time > ScoreUpdate for ProbabilisticScorerUsingTime < G , L , T > where L :: Target : Logger {
1394- fn payment_path_failed ( & mut self , path : & Path , short_channel_id : u64 , _duration_since_epoch : Duration ) {
1402+ fn payment_path_failed ( & mut self , path : & Path , short_channel_id : u64 , duration_since_epoch : Duration ) {
13951403 let amount_msat = path. final_value_msat ( ) ;
13961404 log_trace ! ( self . logger, "Scoring path through to SCID {} as having failed at {} msat" , short_channel_id, amount_msat) ;
13971405 let network_graph = self . network_graph . read_only ( ) ;
@@ -1414,13 +1422,15 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreUpdate for Prob
14141422 . entry ( hop. short_channel_id )
14151423 . or_insert_with ( ChannelLiquidity :: new)
14161424 . as_directed_mut ( source, & target, capacity_msat, self . decay_params )
1417- . failed_at_channel ( amount_msat, format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
1425+ . failed_at_channel ( amount_msat, duration_since_epoch,
1426+ format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
14181427 } else {
14191428 self . channel_liquidities
14201429 . entry ( hop. short_channel_id )
14211430 . or_insert_with ( ChannelLiquidity :: new)
14221431 . as_directed_mut ( source, & target, capacity_msat, self . decay_params )
1423- . failed_downstream ( amount_msat, format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
1432+ . failed_downstream ( amount_msat, duration_since_epoch,
1433+ format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
14241434 }
14251435 } else {
14261436 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)." ,
@@ -1430,7 +1440,7 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreUpdate for Prob
14301440 }
14311441 }
14321442
1433- fn payment_path_successful ( & mut self , path : & Path , _duration_since_epoch : Duration ) {
1443+ fn payment_path_successful ( & mut self , path : & Path , duration_since_epoch : Duration ) {
14341444 let amount_msat = path. final_value_msat ( ) ;
14351445 log_trace ! ( self . logger, "Scoring path through SCID {} as having succeeded at {} msat." ,
14361446 path. hops. split_last( ) . map( |( hop, _) | hop. short_channel_id) . unwrap_or( 0 ) , amount_msat) ;
@@ -1448,7 +1458,8 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreUpdate for Prob
14481458 . entry ( hop. short_channel_id )
14491459 . or_insert_with ( ChannelLiquidity :: new)
14501460 . as_directed_mut ( source, & target, capacity_msat, self . decay_params )
1451- . successful ( amount_msat, format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
1461+ . successful ( amount_msat, duration_since_epoch,
1462+ format_args ! ( "SCID {}, towards {:?}" , hop. short_channel_id, target) , & self . logger ) ;
14521463 } else {
14531464 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)." ,
14541465 hop. short_channel_id) ;
@@ -1464,12 +1475,15 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreUpdate for Prob
14641475 self . payment_path_failed ( path, u64:: max_value ( ) , duration_since_epoch)
14651476 }
14661477
1467- fn decay_liquidity_certainty ( & mut self , _duration_since_epoch : Duration ) {
1478+ fn decay_liquidity_certainty ( & mut self , duration_since_epoch : Duration ) {
14681479 let decay_params = self . decay_params ;
14691480 self . channel_liquidities . retain ( |_scid, liquidity| {
1470- liquidity. min_liquidity_offset_msat = liquidity. decayed_offset ( liquidity. min_liquidity_offset_msat , decay_params) ;
1471- liquidity. max_liquidity_offset_msat = liquidity. decayed_offset ( liquidity. max_liquidity_offset_msat , decay_params) ;
1481+ liquidity. min_liquidity_offset_msat =
1482+ liquidity. decayed_offset ( liquidity. min_liquidity_offset_msat , duration_since_epoch, decay_params) ;
1483+ liquidity. max_liquidity_offset_msat =
1484+ liquidity. decayed_offset ( liquidity. max_liquidity_offset_msat , duration_since_epoch, decay_params) ;
14721485 liquidity. last_updated = T :: now ( ) ;
1486+
14731487 let elapsed_time =
14741488 T :: now ( ) . duration_since ( liquidity. offset_history_last_updated ) ;
14751489 if elapsed_time > decay_params. historical_no_updates_half_life {
@@ -2395,7 +2409,7 @@ mod tests {
23952409
23962410 scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
23972411 . as_directed_mut ( & source, & target, 1_000 , decay_params)
2398- . set_min_liquidity_msat ( 200 ) ;
2412+ . set_min_liquidity_msat ( 200 , Duration :: ZERO ) ;
23992413
24002414 let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
24012415 . as_directed ( & source, & target, 1_000 , decay_params) ;
@@ -2421,7 +2435,7 @@ mod tests {
24212435
24222436 scorer. channel_liquidities . get_mut ( & 43 ) . unwrap ( )
24232437 . as_directed_mut ( & target, & recipient, 1_000 , decay_params)
2424- . set_max_liquidity_msat ( 200 ) ;
2438+ . set_max_liquidity_msat ( 200 , Duration :: ZERO ) ;
24252439
24262440 let liquidity = scorer. channel_liquidities . get ( & 43 ) . unwrap ( )
24272441 . as_directed ( & target, & recipient, 1_000 , decay_params) ;
@@ -2467,7 +2481,7 @@ mod tests {
24672481 // Reset from source to target.
24682482 scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
24692483 . as_directed_mut ( & source, & target, 1_000 , decay_params)
2470- . set_min_liquidity_msat ( 900 ) ;
2484+ . set_min_liquidity_msat ( 900 , Duration :: ZERO ) ;
24712485
24722486 let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
24732487 . as_directed ( & source, & target, 1_000 , decay_params) ;
@@ -2482,7 +2496,7 @@ mod tests {
24822496 // Reset from target to source.
24832497 scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
24842498 . as_directed_mut ( & target, & source, 1_000 , decay_params)
2485- . set_min_liquidity_msat ( 400 ) ;
2499+ . set_min_liquidity_msat ( 400 , Duration :: ZERO ) ;
24862500
24872501 let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
24882502 . as_directed ( & source, & target, 1_000 , decay_params) ;
@@ -2528,7 +2542,7 @@ mod tests {
25282542 // Reset from source to target.
25292543 scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
25302544 . as_directed_mut ( & source, & target, 1_000 , decay_params)
2531- . set_max_liquidity_msat ( 300 ) ;
2545+ . set_max_liquidity_msat ( 300 , Duration :: ZERO ) ;
25322546
25332547 let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
25342548 . as_directed ( & source, & target, 1_000 , decay_params) ;
@@ -2543,7 +2557,7 @@ mod tests {
25432557 // Reset from target to source.
25442558 scorer. channel_liquidities . get_mut ( & 42 ) . unwrap ( )
25452559 . as_directed_mut ( & target, & source, 1_000 , decay_params)
2546- . set_max_liquidity_msat ( 600 ) ;
2560+ . set_max_liquidity_msat ( 600 , Duration :: ZERO ) ;
25472561
25482562 let liquidity = scorer. channel_liquidities . get ( & 42 ) . unwrap ( )
25492563 . as_directed ( & source, & target, 1_000 , decay_params) ;
0 commit comments