* Some hackery to propagate the worker's stderr and exceptions to the
client.
This commit is contained in:
parent
714fa24cfb
commit
7951c3c546
7 changed files with 209 additions and 107 deletions
|
|
@ -872,7 +872,7 @@ static void drain(int fd)
|
|||
if (errno != EINTR)
|
||||
throw SysError("draining");
|
||||
} else if (rd == 0) break;
|
||||
else writeFull(STDERR_FILENO, buffer, rd);
|
||||
else writeToStderr(buffer, rd);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1610,7 +1610,7 @@ void DerivationGoal::handleChildOutput(int fd, const string & data)
|
|||
{
|
||||
if (fd == logPipe.readSide) {
|
||||
if (verbosity >= buildVerbosity)
|
||||
writeFull(STDERR_FILENO, (unsigned char *) data.c_str(), data.size());
|
||||
writeToStderr((unsigned char *) data.c_str(), data.size());
|
||||
writeFull(fdLogFile, (unsigned char *) data.c_str(), data.size());
|
||||
}
|
||||
|
||||
|
|
@ -1923,7 +1923,7 @@ void SubstitutionGoal::handleChildOutput(int fd, const string & data)
|
|||
{
|
||||
assert(fd == logPipe.readSide);
|
||||
if (verbosity >= buildVerbosity)
|
||||
writeFull(STDERR_FILENO, (unsigned char *) data.c_str(), data.size());
|
||||
writeToStderr((unsigned char *) data.c_str(), data.size());
|
||||
/* Don't write substitution output to a log file for now. We
|
||||
probably should, though. */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,10 @@
|
|||
#include "worker-protocol.hh"
|
||||
#include "archive.hh"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <unistd.h>
|
||||
|
||||
|
|
@ -38,9 +42,15 @@ RemoteStore::RemoteStore()
|
|||
if (dup2(toChild.readSide, STDIN_FILENO) == -1)
|
||||
throw SysError("dupping read side");
|
||||
|
||||
execlp(worker.c_str(), worker.c_str(),
|
||||
"--slave", NULL);
|
||||
int fdDebug = open("/tmp/worker-log", O_WRONLY | O_CREAT | O_TRUNC, 0644);
|
||||
assert(fdDebug != -1);
|
||||
if (dup2(fdDebug, STDERR_FILENO) == -1)
|
||||
throw SysError("dupping stderr");
|
||||
close(fdDebug);
|
||||
|
||||
execlp(worker.c_str(), worker.c_str(),
|
||||
"-vvv", "--slave", NULL);
|
||||
|
||||
throw SysError(format("executing `%1%'") % worker);
|
||||
|
||||
} catch (std::exception & e) {
|
||||
|
|
@ -66,9 +76,13 @@ RemoteStore::RemoteStore()
|
|||
|
||||
RemoteStore::~RemoteStore()
|
||||
{
|
||||
writeInt(wopQuit, to);
|
||||
readInt(from);
|
||||
child.wait(true);
|
||||
try {
|
||||
fromChild.readSide.close();
|
||||
toChild.writeSide.close();
|
||||
child.wait(true);
|
||||
} catch (Error & e) {
|
||||
printMsg(lvlError, format("error (ignored): %1%") % e.msg());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -158,6 +172,7 @@ void RemoteStore::buildDerivations(const PathSet & drvPaths)
|
|||
{
|
||||
writeInt(wopBuildDerivations, to);
|
||||
writeStringSet(drvPaths, to);
|
||||
processStderr();
|
||||
readInt(from);
|
||||
}
|
||||
|
||||
|
|
@ -185,4 +200,18 @@ void RemoteStore::syncWithGC()
|
|||
}
|
||||
|
||||
|
||||
void RemoteStore::processStderr()
|
||||
{
|
||||
unsigned int msg;
|
||||
while ((msg = readInt(from)) == STDERR_NEXT) {
|
||||
string s = readString(from);
|
||||
writeToStderr((unsigned char *) s.c_str(), s.size());
|
||||
}
|
||||
if (msg == STDERR_ERROR)
|
||||
throw Error(readString(from));
|
||||
else if (msg != STDERR_LAST)
|
||||
throw Error("protocol error processing standard error");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,6 +57,8 @@ private:
|
|||
FdSink to;
|
||||
FdSource from;
|
||||
Pid child;
|
||||
|
||||
void processStderr();
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -23,4 +23,9 @@ typedef enum {
|
|||
} WorkerOp;
|
||||
|
||||
|
||||
#define STDERR_NEXT 0x6f6c6d67
|
||||
#define STDERR_LAST 0x616c7473
|
||||
#define STDERR_ERROR 0x63787470
|
||||
|
||||
|
||||
#endif /* !__WORKER_PROTOCOL_H */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue