Skip to content

fs: non-bigint stat can give 0.20566138856% bigger results #58726

Closed
@LiviaMedeiros

Description

@LiviaMedeiros

Version

v24.2.0, v25.0.0-pre

Platform

Linux tumba 6.14.8-gentoo-yuran #2 SMP Tue May 27 17:51:23 +08 2025 x86_64 Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz GenuineIntel GNU/Linux

Subsystem

fs

What steps will reproduce the bug?

import fs from 'node:fs/promises';
const f = '/tmp/deleteme-utimes-issue-file';
await fs.writeFile(f, '');

console.log('|', 'set', '|', 'got', '|', 'got/set', '|');
console.log('|', '---', '|', '---', '|', '---', '|');

for (let i = 1; i < Number.MAX_SAFE_INTEGER; i *= 3) {
await fs.utimes(f, i, i);
const { mtimeMs } = await fs.stat(f);
console.log('|', i, '|', mtimeMs, '|', mtimeMs / i, '|');
}

await fs.rm(f);

How often does it reproduce? Is there a required condition?

Reproduces on one specific PC all the time. Couldn't reproduce on any other machine so far.

What is the expected behavior? Why is that the expected behavior?

set got got/set
1 1000 1000
3 3000 1000
9 9000 1000
27 27000 1000
81 81000 1000
243 243000 1000
729 729000 1000
2187 2187000 1000
6561 6561000 1000
19683 19683000 1000
59049 59049000 1000
177147 177147000 1000
531441 531441000 1000
1594323 1594323000 1000
4782969 4782969000 1000
14348907 14348907000 1000
43046721 43046721000 1000
129140163 129140163000 1000
387420489 387420489000 1000
1162261467 1162261467000 1000
3486784401 3486784401000 1000
10460353203 10460353203000 1000
31381059609 15032385535000 479.0273407685939
94143178827 15032385535000 159.67578025619795
282429536481 15032385535000 53.22526008539932
847288609443 15032385535000 17.741753361799773
2541865828329 15032385535000 5.913917787266591
7625597484987 15032385535000 1.9713059290888637
22876792454961 15032385535000 0.6571019763629545
68630377364883 15032385535000 0.21903399212098484
205891132094649 15032385535000 0.07301133070699495
617673396283947 15032385535000 0.024337110235664983
1853020188851841 15032385535000 0.008112370078554995
5559060566555523 15032385535000 0.0027041233595183315

Expected because 1 second is 1000 milliseconds

What do you see instead?

set got got/set
1 1002.0566138856454 1002.0566138856454
3 3006.169841656936 1002.0566138856453
9 9018.509524970808 1002.0566138856453
27 27055.528574912427 1002.0566138856454
81 81166.58572473728 1002.0566138856454
243 243499.75717421185 1002.0566138856454
729 730499.2715226355 1002.0566138856453
2187 2191497.814567907 1002.0566138856456
6561 6574493.443703719 1002.0566138856454
19683 19723480.33111116 1002.0566138856454
59049 59170440.99333348 1002.0566138856454
177147 177511322.98000044 1002.0566138856454
531441 532533968.9400013 1002.0566138856454
1594323 1597601906.820004 1002.0566138856454
4782969 4792805720.4600115 1002.0566138856454
14348907 14378417161.380035 1002.0566138856454
43046721 43135251484.14011 1002.0566138856454
129140163 129405754452.42032 1002.0566138856454
387420489 388217263357.2609 1002.0566138856453
1162261467 1164651790071.783 1002.0566138856456
3486784401 3493955370215.3486 1002.0566138856454
10460353203 10481866110646.045 1002.0566138856453
31381059609 15063301347825.656 480.0125150492224
94143178827 15063301347825.656 160.0041716830741
282429536481 15063301347825.656 53.33472389435804
847288609443 15063301347825.656 17.778241298119347
2541865828329 15063301347825.656 5.926080432706449
7625597484987 15063301347825.656 1.975360144235483
22876792454961 15063301347825.656 0.6584533814118276
68630377364883 15063301347825.656 0.2194844604706092
205891132094649 15063301347825.656 0.0731614868235364
617673396283947 15063301347825.656 0.024387162274512136
1853020188851841 15063301347825.656 0.008129054091504046
5559060566555523 15063301347825.656 0.002709684697168015

Additional information

This issue causes test/parallel/test-fs-cp.mjs, test/parallel/test-fs-promises.js, test/parallel/test-fs-stat-bigint.js, and test/parallel/test-fs-utimes-y2K38.js fail for me locally every time. 😧

This issue persists for statSync(), too.
This issue persists between different filesystems.

This issue does not appear when using bigint option.
This issue does not appear when using touch/stat, or similar functions in other languages.

I suspect some weird bug with floating point.

Metadata

Metadata

Assignees

No one assigned

    Labels

    fsIssues and PRs related to the fs subsystem / file system.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions