summary refs log tree commit diff
path: root/nix/libutil/util.cc
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2020-01-11 18:46:23 +0100
committerLudovic Courtès <ludo@gnu.org>2020-01-12 00:19:09 +0100
commit7033c7692ccbbbad8f7b9952015de071a5588e87 (patch)
treeb9745bafa5fc88819f55224aa06a048d760ca063 /nix/libutil/util.cc
parent79154f0a09ad748839f88120ddd61a0e1e147b5e (diff)
downloadguix-7033c7692ccbbbad8f7b9952015de071a5588e87.tar.gz
daemon: Account for deleted store files when deduplication is on.
Previously, a store item that is a regular file would not be accounted
for in the 'bytesFreed' value computed by 'deletePath' because its
'st_nlink' count would always be >= 2.  This commit fixes that.

* nix/libutil/util.hh (deletePath): Add optional 'linkThreshold' argument.
* nix/libutil/util.cc (_deletePath): Add 'linkThreshold' argument and
honor it.  Pass it down in recursive call.
(deletePath): Add 'linkThreshold' and honor it.
* nix/libstore/gc.cc (LocalStore::deleteGarbage): Pass 'linkThreshold'
argument to 'deletePath', with a value of 2 when PATH is a store item
and deduplication is on.
Diffstat (limited to 'nix/libutil/util.cc')
-rw-r--r--nix/libutil/util.cc10
1 files changed, 5 insertions, 5 deletions
diff --git a/nix/libutil/util.cc b/nix/libutil/util.cc
index faba3789df..fb2dfad1f7 100644
--- a/nix/libutil/util.cc
+++ b/nix/libutil/util.cc
@@ -305,7 +305,7 @@ void writeLine(int fd, string s)
 }
 
 
-static void _deletePath(const Path & path, unsigned long long & bytesFreed)
+static void _deletePath(const Path & path, unsigned long long & bytesFreed, size_t linkThreshold)
 {
     checkInterrupt();
 
@@ -324,7 +324,7 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed)
     struct stat st = lstat(path);
 #endif
 
-    if (!S_ISDIR(st.st_mode) && st.st_nlink == 1)
+    if (!S_ISDIR(st.st_mode) && st.st_nlink <= linkThreshold)
 	bytesFreed += st.st_size;
 
     if (S_ISDIR(st.st_mode)) {
@@ -335,7 +335,7 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed)
         }
 
         for (auto & i : readDirectory(path))
-            _deletePath(path + "/" + i.name, bytesFreed);
+            _deletePath(path + "/" + i.name, bytesFreed, linkThreshold);
     }
 #undef st_mode
 #undef st_size
@@ -353,12 +353,12 @@ void deletePath(const Path & path)
 }
 
 
-void deletePath(const Path & path, unsigned long long & bytesFreed)
+void deletePath(const Path & path, unsigned long long & bytesFreed, size_t linkThreshold)
 {
     startNest(nest, lvlDebug,
         format("recursively deleting path `%1%'") % path);
     bytesFreed = 0;
-    _deletePath(path, bytesFreed);
+    _deletePath(path, bytesFreed, linkThreshold);
 }