1
0
mirror of https://git.savannah.gnu.org/git/guix.git synced 2026-05-29 12:35:15 +02:00

daemon: Do not deduplicate files smaller than 8 KiB.

Files smaller than 8 KiB typically represent ~70% of the entries in
/gnu/store/.links but only contribute to ~4% of the space savings
afforded by deduplication.

Not considering these files for deduplication speeds up file insertion
in the store and, more importantly, leaves 'removeUnusedLinks' with
fewer entries to traverse, thereby speeding it up proportionally.

Partly fixes <https://issues.guix.gnu.org/24937>.

* config-daemon.ac: Remove symlink hard link check and CAN_LINK_SYMLINK
definition.
* guix/store/deduplication.scm (%deduplication-minimum-size): New
variable.
(deduplicate)[loop]: Do not recurse when FILE's size is below
%DEDUPLICATION-MINIMUM-SIZE.
(dump-port): New procedure.
(dump-file/deduplicate)[hash]: Turn into...
[dump-and-compute-hash]: ... this thunk.
Call 'deduplicate' only when SIZE is greater than
%DEDUPLICATION-MINIMUM-SIZE; otherwise call 'dump-port'.
* nix/libstore/gc.cc (LocalStore::removeUnusedLinks): Drop files where
st.st_size < deduplicationMinSize.
* nix/libstore/local-store.hh (deduplicationMinSize): New declaration.
* nix/libstore/optimise-store.cc (deduplicationMinSize): New variable.
(LocalStore::optimisePath_): Return when PATH is a symlink or smaller
than 'deduplicationMinSize'.
* tests/derivations.scm ("identical files are deduplicated"): Produce
files bigger than %DEDUPLICATION-MINIMUM-SIZE.
* tests/nar.scm ("restore-file-set with directories (signed, valid)"):
Likewise.
* tests/store-deduplication.scm ("deduplicate, below %deduplication-minimum-size"):
New test.
("deduplicate", "deduplicate, ENOSPC"): Produce files bigger than
%DEDUPLICATION-MINIMUM-SIZE.
* tests/store.scm ("substitute, deduplication"): Likewise.
This commit is contained in:
Ludovic Courtès
2021-11-13 21:47:15 +01:00
parent f39397b210
commit 472a0e82a5
9 changed files with 126 additions and 42 deletions
+9 -6
View File
@@ -15,6 +15,9 @@
namespace nix {
/* Any file smaller than this is not considered for deduplication.
Keep in sync with (guix store deduplication). */
const size_t deduplicationMinSize = 8192;
static void makeWritable(const Path & path)
{
@@ -105,12 +108,12 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa
return;
}
/* We can hard link regular files and maybe symlinks. */
if (!S_ISREG(st.st_mode)
#if CAN_LINK_SYMLINK
&& !S_ISLNK(st.st_mode)
#endif
) return;
/* We can hard link regular files (and maybe symlinks), but do that only
for files larger than some threshold. This avoids adding too many
entries to '.links', which would slow down 'removeUnusedLinks' while
saving little space. */
if (!S_ISREG(st.st_mode) || ((size_t) st.st_size) < deduplicationMinSize)
return;
/* Sometimes SNAFUs can cause files in the store to be
modified, in particular when running programs as root under