mirror of
https://github.com/rustfs/rustfs.git
synced 2026-07-27 00:38:16 +00:00
09e6983175
fix(object-capacity): use u128 intermediate to stop sampling estimate overflow (backlog#1012) The three sampling extrapolation sites in scan.rs computed `overflow_sampled_bytes.saturating_mul(overflow_count) / sampled_count`, multiplying in u64 before dividing. On very large disks the product exceeds u64::MAX and saturates to a constant, so dividing by a sampled_count that grows with disk size yields an estimate that monotonically shrinks — bigger disks report less capacity. It only sets is_estimated, with no alert. Extract a shared `estimate_overflow_bytes` helper that performs the multiplication in u128, divides, then clamps to u64::MAX, so the intermediate product can never overflow. It also guards division by zero with `.max(1)` even though callers only enter the branch when sampled_count > 0. Adds unit tests covering the realistic ~105 TB regression scenario (asserting the inputs actually overflow u64 and the fixed estimate dwarfs the saturated value), monotonic scaling across disk sizes, extreme-value clamping, small non-overflowing inputs (unchanged), and the zero-sampled-count guard, all compared against a u128 reference implementation. Refs: https://github.com/rustfs/backlog/issues/1012