[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
04/05: daemon: GC remove-unused-links phase uses 'statx' when available.
From: |
guix-commits |
Subject: |
04/05: daemon: GC remove-unused-links phase uses 'statx' when available. |
Date: |
Tue, 26 Nov 2019 18:03:34 -0500 (EST) |
civodul pushed a commit to branch master
in repository guix.
commit 7738a72186583afb3bb2e0a866c8aba130372400
Author: Ludovic Courtès <address@hidden>
Date: Tue Nov 26 23:35:24 2019 +0100
daemon: GC remove-unused-links phase uses 'statx' when available.
* config-daemon.ac: Check for 'statx'.
* nix/libstore/gc.cc (LocalStore::removeUnusedLinks) [HAVE_STATX]: Use
'statx' instead of 'lstat'.
---
config-daemon.ac | 3 ++-
nix/libstore/gc.cc | 11 +++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/config-daemon.ac b/config-daemon.ac
index 848e1e5..50ead35 100644
--- a/config-daemon.ac
+++ b/config-daemon.ac
@@ -91,8 +91,9 @@ if test "x$guix_build_daemon" = "xyes"; then
dnl sched_setaffinity: to improve RPC locality.
dnl statvfs: to detect disk-full conditions.
dnl strsignal: for error reporting.
+ dnl statx: fine-grain 'stat' call, new in glibc 2.28.
AC_CHECK_FUNCS([lutimes lchown posix_fallocate sched_setaffinity \
- statvfs nanosleep strsignal])
+ statvfs nanosleep strsignal statx])
dnl Check whether the store optimiser can optimise symlinks.
AC_MSG_CHECKING([whether it is possible to create a link to a symlink])
diff --git a/nix/libstore/gc.cc b/nix/libstore/gc.cc
index 7976ff7..29b75aa 100644
--- a/nix/libstore/gc.cc
+++ b/nix/libstore/gc.cc
@@ -570,8 +570,17 @@ void LocalStore::removeUnusedLinks(const GCState & state)
if (name == "." || name == "..") continue;
Path path = linksDir + "/" + name;
+#ifdef HAVE_STATX
+# define st_size stx_size
+# define st_nlink stx_nlink
+ struct statx st;
+ if (statx(AT_FDCWD, path.c_str(),
+ AT_SYMLINK_NOFOLLOW | AT_STATX_DONT_SYNC,
+ STATX_SIZE | STATX_NLINK, &st) == -1)
+#else
struct stat st;
if (lstat(path.c_str(), &st) == -1)
+#endif
throw SysError(format("statting `%1%'") % path);
if (st.st_nlink != 1) {
@@ -586,6 +595,8 @@ void LocalStore::removeUnusedLinks(const GCState & state)
throw SysError(format("deleting `%1%'") % path);
state.results.bytesFreed += st.st_size;
+#undef st_size
+#undef st_nlink
}
struct stat st;