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'.master
parent
434138e2f2
commit
7738a72186
|
@ -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;
|
||||
|
|
Reference in New Issue