diff options
author | Sergei Trofimovich <slyich@gmail.com> | 2022-03-12 21:56:08 +0000 |
---|---|---|
committer | Sergei Trofimovich <slyich@gmail.com> | 2022-03-13 07:24:48 +0000 |
commit | 6b1872312f1b505334acb67b8bf7990b0a0fdbd8 (patch) | |
tree | 24eb7c1aa698cfadf8249dfa0cf0afe69f00686d /src/libutil | |
parent | d5322698a2abbc6d141e1d244e17b0d226a2f18b (diff) |
nix store gc: account for auto-optimised store
Before the change on a system with `auto-optimise-store = true`:
$ nix store gc --verbose --max 1
deleted all the paths instead of one path (we requested 1 byte limit).
It happens because every file in `auto-optimise-store = true` has at
least 2 links: file itself and a link in /nix/store/.links/ directory.
The change conservatively assumes that any file that has one (as before)
or two links (assume auto-potimise mode) will free space.
Co-authored-by: Sandro <sandro.jaeckel@gmail.com>
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/util.cc | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 9f13d5f02..70eaf4f9c 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -406,8 +406,29 @@ static void _deletePath(int parentfd, const Path & path, uint64_t & bytesFreed) throw SysError("getting status of '%1%'", path); } - if (!S_ISDIR(st.st_mode) && st.st_nlink == 1) - bytesFreed += st.st_size; + if (!S_ISDIR(st.st_mode)) { + /* We are about to delete a file. Will it likely free space? */ + + switch (st.st_nlink) { + /* Yes: last link. */ + case 1: + bytesFreed += st.st_size; + break; + /* Maybe: yes, if 'auto-optimise-store' or manual optimisation + was performed. Instead of checking for real let's assume + it's an optimised file and space will be freed. + + In worst case we will double count on freed space for files + with exactly two hardlinks for unoptimised packages. + */ + case 2: + bytesFreed += st.st_size; + break; + /* No: 3+ links. */ + default: + break; + } + } if (S_ISDIR(st.st_mode)) { /* Make the directory accessible. */ |