Skip to content

Commit 6d470e1

Browse files
Snezhkkoyongkangc
authored andcommitted
fix(prune): use saturating_sub in PruneLimiter::deleted_entries_limit_left (#19535)
1 parent aad32d2 commit 6d470e1

File tree

1 file changed

+32
-1
lines changed

1 file changed

+32
-1
lines changed

crates/prune/prune/src/limiter.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)