diff options
Diffstat (limited to 'src/libstore/local-store.cc')
-rw-r--r-- | src/libstore/local-store.cc | 124 |
1 files changed, 69 insertions, 55 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 272d48741114..612efde7bb8f 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -45,7 +45,7 @@ LocalStore::LocalStore(const Params & params) , reservedPath(dbDir + "/reserved") , schemaPath(dbDir + "/schema") , trashDir(realStoreDir + "/trash") - , requireSigs(settings.get("signed-binary-caches", std::string("")) != "") // FIXME: rename option + , requireSigs(trim(settings.get("signed-binary-caches", std::string(""))) != "") // FIXME: rename option , publicKeys(getDefaultPublicKeys()) { auto state(_state.lock()); @@ -77,7 +77,7 @@ LocalStore::LocalStore(const Params & params) struct group * gr = getgrnam(settings.buildUsersGroup.c_str()); if (!gr) - printMsg(lvlError, format("warning: the group ‘%1%’ specified in ‘build-users-group’ does not exist") + printError(format("warning: the group ‘%1%’ specified in ‘build-users-group’ does not exist") % settings.buildUsersGroup); else { struct stat st; @@ -125,7 +125,7 @@ LocalStore::LocalStore(const Params & params) #endif if (res == -1) { writeFull(fd.get(), string(settings.reservedSize, 'X')); - ftruncate(fd.get(), settings.reservedSize); + [[gnu::unused]] auto res2 = ftruncate(fd.get(), settings.reservedSize); } } } catch (SysError & e) { /* don't care about errors */ @@ -137,7 +137,7 @@ LocalStore::LocalStore(const Params & params) globalLock = openLockFile(globalLockPath.c_str(), true); if (!lockFile(globalLock.get(), ltRead, false)) { - printMsg(lvlError, "waiting for the big Nix store lock..."); + printError("waiting for the big Nix store lock..."); lockFile(globalLock.get(), ltRead, true); } @@ -168,7 +168,7 @@ LocalStore::LocalStore(const Params & params) "please upgrade Nix to version 1.11 first."); if (!lockFile(globalLock.get(), ltWrite, false)) { - printMsg(lvlError, "waiting for exclusive access to the Nix store..."); + printError("waiting for exclusive access to the Nix store..."); lockFile(globalLock.get(), ltWrite, true); } @@ -578,49 +578,54 @@ Hash parseHashField(const Path & path, const string & s) } -std::shared_ptr<ValidPathInfo> LocalStore::queryPathInfoUncached(const Path & path) +void LocalStore::queryPathInfoUncached(const Path & path, + std::function<void(std::shared_ptr<ValidPathInfo>)> success, + std::function<void(std::exception_ptr exc)> failure) { - auto info = std::make_shared<ValidPathInfo>(); - info->path = path; + sync2async<std::shared_ptr<ValidPathInfo>>(success, failure, [&]() { - assertStorePath(path); + auto info = std::make_shared<ValidPathInfo>(); + info->path = path; - return retrySQLite<std::shared_ptr<ValidPathInfo>>([&]() { - auto state(_state.lock()); + assertStorePath(path); + + return retrySQLite<std::shared_ptr<ValidPathInfo>>([&]() { + auto state(_state.lock()); - /* Get the path info. */ - auto useQueryPathInfo(state->stmtQueryPathInfo.use()(path)); + /* Get the path info. */ + auto useQueryPathInfo(state->stmtQueryPathInfo.use()(path)); - if (!useQueryPathInfo.next()) - return std::shared_ptr<ValidPathInfo>(); + if (!useQueryPathInfo.next()) + return std::shared_ptr<ValidPathInfo>(); - info->id = useQueryPathInfo.getInt(0); + info->id = useQueryPathInfo.getInt(0); - info->narHash = parseHashField(path, useQueryPathInfo.getStr(1)); + info->narHash = parseHashField(path, useQueryPathInfo.getStr(1)); - info->registrationTime = useQueryPathInfo.getInt(2); + info->registrationTime = useQueryPathInfo.getInt(2); - auto s = (const char *) sqlite3_column_text(state->stmtQueryPathInfo, 3); - if (s) info->deriver = s; + auto s = (const char *) sqlite3_column_text(state->stmtQueryPathInfo, 3); + if (s) info->deriver = s; - /* Note that narSize = NULL yields 0. */ - info->narSize = useQueryPathInfo.getInt(4); + /* Note that narSize = NULL yields 0. */ + info->narSize = useQueryPathInfo.getInt(4); - info->ultimate = useQueryPathInfo.getInt(5) == 1; + info->ultimate = useQueryPathInfo.getInt(5) == 1; - s = (const char *) sqlite3_column_text(state->stmtQueryPathInfo, 6); - if (s) info->sigs = tokenizeString<StringSet>(s, " "); + s = (const char *) sqlite3_column_text(state->stmtQueryPathInfo, 6); + if (s) info->sigs = tokenizeString<StringSet>(s, " "); - s = (const char *) sqlite3_column_text(state->stmtQueryPathInfo, 7); - if (s) info->ca = s; + s = (const char *) sqlite3_column_text(state->stmtQueryPathInfo, 7); + if (s) info->ca = s; - /* Get the references. */ - auto useQueryReferences(state->stmtQueryReferences.use()(info->id)); + /* Get the references. */ + auto useQueryReferences(state->stmtQueryReferences.use()(info->id)); - while (useQueryReferences.next()) - info->references.insert(useQueryReferences.getStr(0)); + while (useQueryReferences.next()) + info->references.insert(useQueryReferences.getStr(0)); - return info; + return info; + }); }); } @@ -777,18 +782,27 @@ Path LocalStore::queryPathFromHashPart(const string & hashPart) PathSet LocalStore::querySubstitutablePaths(const PathSet & paths) { if (!settings.useSubstitutes) return PathSet(); + + auto remaining = paths; PathSet res; + for (auto & sub : getDefaultSubstituters()) { + if (remaining.empty()) break; if (sub->storeDir != storeDir) continue; if (!sub->wantMassQuery()) continue; - for (auto & path : paths) { - if (res.count(path)) continue; - debug(format("checking substituter ‘%s’ for path ‘%s’") - % sub->getUri() % path); - if (sub->isValidPath(path)) + + auto valid = sub->queryValidPaths(remaining); + + PathSet remaining2; + for (auto & path : remaining) + if (valid.count(path)) res.insert(path); - } + else + remaining2.insert(path); + + std::swap(remaining, remaining2); } + return res; } @@ -896,10 +910,10 @@ void LocalStore::invalidatePath(State & state, const Path & path) } -void LocalStore::addToStore(const ValidPathInfo & info, const std::string & nar, - bool repair, bool dontCheckSigs) +void LocalStore::addToStore(const ValidPathInfo & info, const ref<std::string> & nar, + bool repair, bool dontCheckSigs, std::shared_ptr<FSAccessor> accessor) { - Hash h = hashString(htSHA256, nar); + Hash h = hashString(htSHA256, *nar); if (h != info.narHash) throw Error(format("hash mismatch importing path ‘%s’; expected hash ‘%s’, got ‘%s’") % info.path % info.narHash.to_string() % h.to_string()); @@ -926,7 +940,7 @@ void LocalStore::addToStore(const ValidPathInfo & info, const std::string & nar, deletePath(realPath); - StringSource source(nar); + StringSource source(*nar); restorePath(realPath, source); canonicalisePathMetaData(realPath, -1); @@ -1104,7 +1118,7 @@ void LocalStore::invalidatePathChecked(const Path & path) bool LocalStore::verifyStore(bool checkContents, bool repair) { - printMsg(lvlError, format("reading the Nix store...")); + printError(format("reading the Nix store...")); bool errors = false; @@ -1115,7 +1129,7 @@ bool LocalStore::verifyStore(bool checkContents, bool repair) for (auto & i : readDirectory(realStoreDir)) store.insert(i.name); /* Check whether all valid paths actually exist. */ - printMsg(lvlInfo, "checking path existence..."); + printInfo("checking path existence..."); PathSet validPaths2 = queryAllValidPaths(), validPaths, done; @@ -1128,7 +1142,7 @@ bool LocalStore::verifyStore(bool checkContents, bool repair) /* Optionally, check the content hashes (slow). */ if (checkContents) { - printMsg(lvlInfo, "checking hashes..."); + printInfo("checking hashes..."); Hash nullHash(htSHA256); @@ -1141,7 +1155,7 @@ bool LocalStore::verifyStore(bool checkContents, bool repair) HashResult current = hashPath(info->narHash.type, i); if (info->narHash != nullHash && info->narHash != current.first) { - printMsg(lvlError, format("path ‘%1%’ was modified! " + printError(format("path ‘%1%’ was modified! " "expected hash ‘%2%’, got ‘%3%’") % i % printHash(info->narHash) % printHash(current.first)); if (repair) repairPath(i); else errors = true; @@ -1151,14 +1165,14 @@ bool LocalStore::verifyStore(bool checkContents, bool repair) /* Fill in missing hashes. */ if (info->narHash == nullHash) { - printMsg(lvlError, format("fixing missing hash on ‘%1%’") % i); + printError(format("fixing missing hash on ‘%1%’") % i); info->narHash = current.first; update = true; } /* Fill in missing narSize fields (from old stores). */ if (info->narSize == 0) { - printMsg(lvlError, format("updating size field on ‘%1%’ to %2%") % i % current.second); + printError(format("updating size field on ‘%1%’ to %2%") % i % current.second); info->narSize = current.second; update = true; } @@ -1174,9 +1188,9 @@ bool LocalStore::verifyStore(bool checkContents, bool repair) /* It's possible that the path got GC'ed, so ignore errors on invalid paths. */ if (isValidPath(i)) - printMsg(lvlError, format("error: %1%") % e.msg()); + printError(format("error: %1%") % e.msg()); else - printMsg(lvlError, format("warning: %1%") % e.msg()); + printError(format("warning: %1%") % e.msg()); errors = true; } } @@ -1195,7 +1209,7 @@ void LocalStore::verifyPath(const Path & path, const PathSet & store, done.insert(path); if (!isStorePath(path)) { - printMsg(lvlError, format("path ‘%1%’ is not in the Nix store") % path); + printError(format("path ‘%1%’ is not in the Nix store") % path); auto state(_state.lock()); invalidatePath(*state, path); return; @@ -1214,16 +1228,16 @@ void LocalStore::verifyPath(const Path & path, const PathSet & store, } if (canInvalidate) { - printMsg(lvlError, format("path ‘%1%’ disappeared, removing from database...") % path); + printError(format("path ‘%1%’ disappeared, removing from database...") % path); auto state(_state.lock()); invalidatePath(*state, path); } else { - printMsg(lvlError, format("path ‘%1%’ disappeared, but it still has valid referrers!") % path); + printError(format("path ‘%1%’ disappeared, but it still has valid referrers!") % path); if (repair) try { repairPath(path); } catch (Error & e) { - printMsg(lvlError, format("warning: %1%") % e.msg()); + printError(format("warning: %1%") % e.msg()); errors = true; } else errors = true; @@ -1275,7 +1289,7 @@ static void makeMutable(const Path & path) void LocalStore::upgradeStore7() { if (getuid() != 0) return; - printMsg(lvlError, "removing immutable bits from the Nix store (this may take a while)..."); + printError("removing immutable bits from the Nix store (this may take a while)..."); makeMutable(realStoreDir); } |