removeUnusedLinks(): Print stats on disk space saved by hard linking

This commit is contained in:
Eelco Dolstra 2012-08-01 19:01:50 -04:00
parent 234ce610e0
commit 1df702d347

View file

@ -581,6 +581,8 @@ void LocalStore::removeUnusedLinks()
AutoCloseDir dir = opendir(linksDir.c_str()); AutoCloseDir dir = opendir(linksDir.c_str());
if (!dir) throw SysError(format("opening directory `%1%'") % linksDir); if (!dir) throw SysError(format("opening directory `%1%'") % linksDir);
unsigned long long actualSize = 0, unsharedSize = 0;
struct dirent * dirent; struct dirent * dirent;
while (errno = 0, dirent = readdir(dir)) { while (errno = 0, dirent = readdir(dir)) {
checkInterrupt(); checkInterrupt();
@ -592,13 +594,26 @@ void LocalStore::removeUnusedLinks()
if (lstat(path.c_str(), &st) == -1) if (lstat(path.c_str(), &st) == -1)
throw SysError(format("statting `%1%'") % path); throw SysError(format("statting `%1%'") % path);
if (st.st_nlink != 1) continue; if (st.st_nlink != 1) {
unsigned long long size = st.st_blocks * 512ULL;
actualSize += size;
unsharedSize += (st.st_nlink - 1) * size;
continue;
}
printMsg(lvlTalkative, format("deleting unused link `%1%'") % path); printMsg(lvlTalkative, format("deleting unused link `%1%'") % path);
if (unlink(path.c_str()) == -1) if (unlink(path.c_str()) == -1)
throw SysError(format("deleting `%1%'") % path); throw SysError(format("deleting `%1%'") % path);
} }
struct stat st;
if (stat(linksDir.c_str(), &st) == -1)
throw SysError(format("statting `%1%'") % linksDir);
unsigned long long overhead = st.st_blocks * 512ULL;
printMsg(lvlInfo, format("note: currently hard linking saves %.2f MiB")
% ((unsharedSize - actualSize - overhead) / (1024.0 * 1024.0)));
} }