diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-08-01 17:20:25 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-05-11 17:15:12 +0200 |
commit | 666c9b7108e460f0d3450015a3379bfeb3e3a497 (patch) | |
tree | 841cb16b1b3e9e91f073a95725dfa8a71755b79a | |
parent | 82d463d9cacbf2a93b95ab5313567d593fd00d02 (diff) | |
download | guix-666c9b7108e460f0d3450015a3379bfeb3e3a497.tar.gz |
findRoots(): Prevent a call to lstat()
This means that getting the roots from /nix/var/nix/.../hydra-roots doesn't need any I/O other than reading the directory.
-rw-r--r-- | nix/libstore/gc.cc | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/nix/libstore/gc.cc b/nix/libstore/gc.cc index e869745912..00bf1526b3 100644 --- a/nix/libstore/gc.cc +++ b/nix/libstore/gc.cc @@ -294,18 +294,23 @@ static void foundRoot(StoreAPI & store, } -static void findRoots(StoreAPI & store, const Path & path, Roots & roots) +static void findRoots(StoreAPI & store, const Path & path, unsigned char type, Roots & roots) { try { - struct stat st = lstat(path); + if (type == DT_UNKNOWN) { + struct stat st = lstat(path); + if (S_ISDIR(st.st_mode)) type = DT_DIR; + else if (S_ISLNK(st.st_mode)) type = DT_LNK; + else if (S_ISREG(st.st_mode)) type = DT_REG; + } - if (S_ISDIR(st.st_mode)) { + if (type == DT_DIR) { for (auto & i : readDirectory(path)) - findRoots(store, path + "/" + i.name, roots); + findRoots(store, path + "/" + i.name, i.type, roots); } - else if (S_ISLNK(st.st_mode)) { + else if (type == DT_LNK) { Path target = readLink(path); if (isInStore(target)) foundRoot(store, path, target, roots); @@ -327,7 +332,7 @@ static void findRoots(StoreAPI & store, const Path & path, Roots & roots) } } - else if (S_ISREG(st.st_mode)) { + else if (type == DT_REG) { Path storePath = settings.nixStore + "/" + baseNameOf(path); if (store.isValidPath(storePath)) roots[path] = storePath; @@ -350,9 +355,9 @@ Roots LocalStore::findRoots() Roots roots; /* Process direct roots in {gcroots,manifests,profiles}. */ - nix::findRoots(*this, settings.nixStateDir + "/" + gcRootsDir, roots); - nix::findRoots(*this, settings.nixStateDir + "/manifests", roots); - nix::findRoots(*this, settings.nixStateDir + "/profiles", roots); + nix::findRoots(*this, settings.nixStateDir + "/" + gcRootsDir, DT_UNKNOWN, roots); + nix::findRoots(*this, settings.nixStateDir + "/manifests", DT_UNKNOWN, roots); + nix::findRoots(*this, settings.nixStateDir + "/profiles", DT_UNKNOWN, roots); return roots; } |