From 732c96f182386d1be00ebf47d332d8c81b878dcf Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Fri, 22 Nov 2019 11:33:29 +0100 Subject: daemon: GC displays how much it has collected. * nix/libstore/gc.cc (LocalStore::deletePathRecursive): Display the percentage reached relative to 'maxFreed', or the total amount of data deleted when 'maxFreed' is ULLONG_MAX. --- nix/libstore/gc.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'nix/libstore/gc.cc') diff --git a/nix/libstore/gc.cc b/nix/libstore/gc.cc index fe152da015..7976ff7d76 100644 --- a/nix/libstore/gc.cc +++ b/nix/libstore/gc.cc @@ -11,6 +11,7 @@ #include #include #include +#include namespace nix { @@ -417,7 +418,15 @@ void LocalStore::deletePathRecursive(GCState & state, const Path & path) throw SysError(format("getting status of %1%") % path); } - printMsg(lvlInfo, format("deleting `%1%'") % path); + if (state.options.maxFreed != ULLONG_MAX) { + double fraction = state.results.bytesFreed + size + / state.options.maxFreed; + unsigned int percentage = (fraction > 1. ? 1. : fraction) * 100.; + printMsg(lvlInfo, format("[%1%%%] deleting '%2%'") % percentage % path); + } else { + size_t total = (state.results.bytesFreed + size) / (1024 * 1024); + printMsg(lvlInfo, format("[%1% MiB] deleting '%2%'") % total % path); + } state.results.paths.insert(path); -- cgit v1.2.3 From 7738a72186583afb3bb2e0a866c8aba130372400 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Tue, 26 Nov 2019 23:35:24 +0100 Subject: 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(-) (limited to 'nix/libstore/gc.cc') diff --git a/config-daemon.ac b/config-daemon.ac index 848e1e58da..50ead355a8 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 7976ff7d76..29b75aa875 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; -- cgit v1.2.3