From 96051dd057d46d5953b2fbe3de67269d175306dc Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 24 Oct 2017 14:47:23 +0200 Subject: [PATCH] More progress indicator improvements Fixes #1599. --- src/build-remote/build-remote.cc | 15 ++++++++++----- src/libstore/build.cc | 8 ++++---- src/libstore/store-api.cc | 12 ++++++++++-- src/libutil/logging.cc | 4 ++-- src/libutil/logging.hh | 3 ++- 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/build-remote/build-remote.cc b/src/build-remote/build-remote.cc index d2fac09f8..419e72053 100644 --- a/src/build-remote/build-remote.cc +++ b/src/build-remote/build-remote.cc @@ -201,25 +201,29 @@ connected: auto inputs = readStrings(source); auto outputs = readStrings(source); + AutoCloseFD uploadLock = openLockFile(currentLoad + "/" + escapeUri(storeUri) + ".upload-lock", true); + { Activity act(*logger, lvlTalkative, actUnknown, fmt("waiting for the upload lock to '%s'", storeUri)); - AutoCloseFD uploadLock = openLockFile(currentLoad + "/" + escapeUri(storeUri) + ".upload-lock", true); - auto old = signal(SIGALRM, handleAlarm); alarm(15 * 60); if (!lockFile(uploadLock.get(), ltWrite, true)) printError("somebody is hogging the upload lock for '%s', continuing..."); alarm(0); signal(SIGALRM, old); - copyPaths(store, ref(sshStore), inputs, NoRepair, NoCheckSigs); - uploadLock = -1; } + { + Activity act(*logger, lvlTalkative, actUnknown, fmt("copying dependencies to '%s'", storeUri)); + copyPaths(store, ref(sshStore), inputs, NoRepair, NoCheckSigs); + } + + uploadLock = -1; + BasicDerivation drv(readDerivation(store->realStoreDir + "/" + baseNameOf(drvPath))); drv.inputSrcs = inputs; - printInfo("building '%s' on '%s'", drvPath, storeUri); auto result = sshStore->buildDerivation(drvPath, drv); if (!result.success()) @@ -230,6 +234,7 @@ connected: if (!store->isValidPath(path)) missing.insert(path); if (!missing.empty()) { + Activity act(*logger, lvlTalkative, actUnknown, fmt("copying outputs from '%s'", storeUri)); setenv("NIX_HELD_LOCKS", concatStringsSep(" ", missing).c_str(), 1); /* FIXME: ugly */ copyPaths(ref(sshStore), store, missing, NoRepair, NoCheckSigs); } diff --git a/src/libstore/build.cc b/src/libstore/build.cc index dcc48bef7..681879c6a 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -1403,7 +1403,7 @@ void DerivationGoal::tryToBuild() auto started = [&]() { act = std::make_unique(*logger, lvlInfo, actBuild, - fmt("building '%s'", drvPath), + hook ? fmt("building '%s' on '%s'", drvPath, machineName) : fmt("building '%s'", drvPath), Logger::Fields{drvPath, hook ? machineName : ""}); mcRunningBuilds = std::make_unique>(worker.runningBuilds); worker.updateProgress(); @@ -1659,7 +1659,7 @@ HookReply DerivationGoal::tryBuildHook() string reply; while (true) { string s = readLine(worker.hook->fromHook.readSide.get()); - if (handleJSONLogMessage(s, worker.act, worker.hook->activities)) + if (handleJSONLogMessage(s, worker.act, worker.hook->activities, true)) ; else if (string(s, 0, 2) == "# ") { reply = string(s, 2); @@ -3270,7 +3270,7 @@ void DerivationGoal::handleChildOutput(int fd, const string & data) if (hook && fd == hook->fromHook.readSide.get()) { for (auto c : data) if (c == '\n') { - handleJSONLogMessage(currentHookLine, worker.act, hook->activities); + handleJSONLogMessage(currentHookLine, worker.act, hook->activities, true); currentHookLine.clear(); } else currentHookLine += c; @@ -3287,7 +3287,7 @@ void DerivationGoal::handleEOF(int fd) void DerivationGoal::flushLine() { - if (handleJSONLogMessage(currentLogLine, *act, builderActivities)) + if (handleJSONLogMessage(currentLogLine, *act, builderActivities, false)) ; else { diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index 3bc5e4c57..17237a035 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -565,8 +565,16 @@ void Store::buildPaths(const PathSet & paths, BuildMode buildMode) void copyStorePath(ref srcStore, ref dstStore, const Path & storePath, RepairFlag repair, CheckSigsFlag checkSigs) { - Activity act(*logger, lvlInfo, actCopyPath, fmt("copying path '%s'", storePath), - {storePath, srcStore->getUri(), dstStore->getUri()}); + auto srcUri = srcStore->getUri(); + auto dstUri = dstStore->getUri(); + + Activity act(*logger, lvlInfo, actCopyPath, + srcUri == "local" + ? fmt("copying path '%s' to '%s'", storePath, dstUri) + : dstUri == "local" + ? fmt("copying path '%s' from '%s'", storePath, srcUri) + : fmt("copying path '%s' from '%s' to '%s'", storePath, srcUri, dstUri), + {storePath, srcUri, dstUri}); PushActivity pact(act.id); auto info = srcStore->queryPathInfo(storePath); diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index 1a2684a43..011155871 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -176,7 +176,7 @@ static Logger::Fields getFields(nlohmann::json & json) } bool handleJSONLogMessage(const std::string & msg, - const Activity & act, std::map & activities) + const Activity & act, std::map & activities, bool trusted) { if (!hasPrefix(msg, "@nix ")) return false; @@ -187,7 +187,7 @@ bool handleJSONLogMessage(const std::string & msg, if (action == "start") { auto type = (ActivityType) json["type"]; - if (type == actDownload || type == actUnknown) + if (trusted || type == actDownload) activities.emplace(std::piecewise_construct, std::forward_as_tuple(json["id"]), std::forward_as_tuple(*logger, (Verbosity) json["level"], type, diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 70a9f5d86..677aa4dae 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -133,7 +133,8 @@ Logger * makeDefaultLogger(); Logger * makeJSONLogger(Logger & prevLogger); bool handleJSONLogMessage(const std::string & msg, - const Activity & act, std::map & activities); + const Activity & act, std::map & activities, + bool trusted); extern Verbosity verbosity; /* suppress msgs > this */