uutils / coreutils

Cross-platform Rust rewrite of the GNU coreutils
https://uutils.github.io/
MIT License
17.57k stars 1.26k forks source link

df statx #3203

Open OH-AU opened 2 years ago

OH-AU commented 2 years ago

checked with 0.0.12 (and 0.0.8) When running df -h /my_fs instead of just checking /my_fs, df iterates through every mounted filesystem with a statx e.g. statx(AT_FDCWD, "/data/something", AT_STATX_SYNC_AS_STAT, STATX_ALL, {stx_mask=STATX_BASIC_STATS, stx_attributes=0, stx_mode=S_IFDIR|0755, stx_size=4096, ...}) = 0 This may be fine with only a few mounts, but when a system has hundreds of mounts it can take some time to return results when the system is under load and run for the first time. gnu df also had this/similar problem but was addressed a long time ago I believe. Wondering if there was a way to only iterate the mount of interest and skip the rest in this case?

jfinkels commented 2 years ago

Maybe pull request #3161 will resolve this issue?

OH-AU commented 2 years ago

I don't believe it does - I grabbed the latest git version - same problem, Then grabbed the updated df.rs file from the above out of tree and it also shows the same behaviour.

crazystylus commented 2 years ago

I think this issue is not specific to df. This issue is created because when uucore::fsext::read_fs_list is invoked, it will create a mount entry for every line read from mtab file and while creation it will call set_missing_fields() which calls std::fs::metadata() for each entry read from mount_info. This will internally make a syscall statx.

Refer to this section of code -> https://github.com/uutils/coreutils/blob/main/src/uucore/src/lib/features/fsext.rs#L150-L163