@@ -96,7 +96,7 @@ impl PruneLimiter {
9696
9797 /// Returns the number of deleted entries left before the limit is reached.
9898 pub fn deleted_entries_limit_left ( & self ) -> Option < usize > {
99- self . deleted_entries_limit . as_ref ( ) . map ( |limit| limit. limit - limit. deleted )
99+ self . deleted_entries_limit . as_ref ( ) . map ( |limit| limit. limit . saturating_sub ( limit. deleted ) )
100100 }
101101
102102 /// Returns the limit on the number of deleted entries (rows in the database).
@@ -411,4 +411,35 @@ mod tests {
411411 sleep ( Duration :: new ( 0 , 10_000_000 ) ) ; // 10 milliseconds
412412 assert ! ( limiter. is_limit_reached( ) , "Limit should be reached when time limit is reached" ) ;
413413 }
414+
415+ #[ test]
416+ fn test_deleted_entries_limit_left_saturation_and_normal ( ) {
417+ // less than limit → no saturation
418+ let mut limiter = PruneLimiter :: default ( ) . set_deleted_entries_limit ( 10 ) ;
419+ limiter. increment_deleted_entries_count_by ( 3 ) ;
420+ assert_eq ! ( limiter. deleted_entries_limit_left( ) , Some ( 7 ) ) ;
421+
422+ // equal to limit → saturates to 0
423+ let mut limiter = PruneLimiter :: default ( ) . set_deleted_entries_limit ( 3 ) ;
424+ limiter. increment_deleted_entries_count_by ( 3 ) ;
425+ assert_eq ! ( limiter. deleted_entries_limit_left( ) , Some ( 0 ) ) ;
426+
427+ // overrun past limit → saturates to 0
428+ let mut limiter = PruneLimiter :: default ( ) . set_deleted_entries_limit ( 10 ) ;
429+ limiter. increment_deleted_entries_count_by ( 12 ) ;
430+ assert_eq ! ( limiter. deleted_entries_limit_left( ) , Some ( 0 ) ) ;
431+
432+ // lowering limit via set → saturates to 0 if below deleted
433+ let mut limiter = PruneLimiter :: default ( ) . set_deleted_entries_limit ( 20 ) ;
434+ limiter. increment_deleted_entries_count_by ( 15 ) ;
435+ let limiter = limiter. set_deleted_entries_limit ( 10 ) ;
436+ assert_eq ! ( limiter. deleted_entries_limit_left( ) , Some ( 0 ) ) ;
437+
438+ // lowering limit via floor → saturates to 0 if below deleted
439+ let mut limiter = PruneLimiter :: default ( ) . set_deleted_entries_limit ( 15 ) ;
440+ limiter. increment_deleted_entries_count_by ( 14 ) ;
441+ let denominator = NonZeroUsize :: new ( 8 ) . unwrap ( ) ;
442+ let limiter = limiter. floor_deleted_entries_limit_to_multiple_of ( denominator) ;
443+ assert_eq ! ( limiter. deleted_entries_limit_left( ) , Some ( 0 ) ) ;
444+ }
414445}
0 commit comments