Browse Source
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'.
wip-system-bootstrap
Ludovic Courtès
3 years ago
No known key found for this signature in database
GPG Key ID: 90B11993D9AEBB5
2 changed files with
13 additions and
1 deletions
-
config-daemon.ac
-
nix/libstore/gc.cc
|
|
@ -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]) |
|
|
|
|
|
@ -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; |
|
|
|