aboutsummaryrefslogtreecommitdiff
path: root/nix
diff options
context:
space:
mode:
Diffstat (limited to 'nix')
-rw-r--r--nix/libstore/gc.cc4
-rw-r--r--nix/libstore/local-store.hh3
-rw-r--r--nix/libstore/optimise-store.cc15
3 files changed, 15 insertions, 7 deletions
diff --git a/nix/libstore/gc.cc b/nix/libstore/gc.cc
index e1d0765154..16519116e4 100644
--- a/nix/libstore/gc.cc
+++ b/nix/libstore/gc.cc
@@ -606,7 +606,9 @@ void LocalStore::removeUnusedLinks(const GCState & state)
throw SysError(format("statting `%1%'") % path);
#endif
- if (st.st_nlink != 1) {
+ /* Drop links for files smaller than 'deduplicationMinSize', even if
+ they have more than one hard link. */
+ if (st.st_nlink != 1 && st.st_size >= deduplicationMinSize) {
actualSize += st.st_size;
unsharedSize += (st.st_nlink - 1) * st.st_size;
continue;
diff --git a/nix/libstore/local-store.hh b/nix/libstore/local-store.hh
index 9ba37219da..20d3c3c893 100644
--- a/nix/libstore/local-store.hh
+++ b/nix/libstore/local-store.hh
@@ -292,4 +292,7 @@ void canonicaliseTimestampAndPermissions(const Path & path);
MakeError(PathInUse, Error);
+/* Size below which a file is not considered for deduplication. */
+extern const size_t deduplicationMinSize;
+
}
diff --git a/nix/libstore/optimise-store.cc b/nix/libstore/optimise-store.cc
index eb303ab4c3..9fd6f3cb35 100644
--- a/nix/libstore/optimise-store.cc
+++ b/nix/libstore/optimise-store.cc
@@ -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