Store build logs in /nix/var/log/nix/drvs/<XX>
...where <XX> is the first two characters of the derivation. Otherwise /nix/var/log/nix/drvs may become so large that we run into all sorts of weird filesystem limits/inefficiences. For instance, ext3/ext4 filesystems will barf with "ext4_dx_add_entry:1551: Directory index full!" once you hit a few million files.
This commit is contained in:
parent
66fa9e6a4d
commit
536c85ea49
2 changed files with 37 additions and 30 deletions
|
@ -2343,13 +2343,15 @@ Path DerivationGoal::openLogFile()
|
||||||
{
|
{
|
||||||
if (!settings.keepLog) return "";
|
if (!settings.keepLog) return "";
|
||||||
|
|
||||||
|
string baseName = baseNameOf(drvPath);
|
||||||
|
|
||||||
/* Create a log file. */
|
/* Create a log file. */
|
||||||
Path dir = (format("%1%/%2%") % settings.nixLogDir % drvsLogDir).str();
|
Path dir = (format("%1%/%2%/%3%/") % settings.nixLogDir % drvsLogDir % string(baseName, 0, 2)).str();
|
||||||
createDirs(dir);
|
createDirs(dir);
|
||||||
|
|
||||||
if (settings.compressLog) {
|
if (settings.compressLog) {
|
||||||
|
|
||||||
Path logFileName = (format("%1%/%2%.bz2") % dir % baseNameOf(drvPath)).str();
|
Path logFileName = (format("%1%/%2%.bz2") % dir % string(baseName, 2)).str();
|
||||||
AutoCloseFD fd = open(logFileName.c_str(), O_CREAT | O_WRONLY | O_TRUNC, 0666);
|
AutoCloseFD fd = open(logFileName.c_str(), O_CREAT | O_WRONLY | O_TRUNC, 0666);
|
||||||
if (fd == -1) throw SysError(format("creating log file `%1%'") % logFileName);
|
if (fd == -1) throw SysError(format("creating log file `%1%'") % logFileName);
|
||||||
closeOnExec(fd);
|
closeOnExec(fd);
|
||||||
|
@ -2364,7 +2366,7 @@ Path DerivationGoal::openLogFile()
|
||||||
return logFileName;
|
return logFileName;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Path logFileName = (format("%1%/%2%") % dir % baseNameOf(drvPath)).str();
|
Path logFileName = (format("%1%/%2%") % dir % string(baseName, 2)).str();
|
||||||
fdLogFile = open(logFileName.c_str(), O_CREAT | O_WRONLY | O_TRUNC, 0666);
|
fdLogFile = open(logFileName.c_str(), O_CREAT | O_WRONLY | O_TRUNC, 0666);
|
||||||
if (fdLogFile == -1) throw SysError(format("creating log file `%1%'") % logFileName);
|
if (fdLogFile == -1) throw SysError(format("creating log file `%1%'") % logFileName);
|
||||||
closeOnExec(fdLogFile);
|
closeOnExec(fdLogFile);
|
||||||
|
|
|
@ -460,35 +460,40 @@ static void opReadLog(Strings opFlags, Strings opArgs)
|
||||||
foreach (Strings::iterator, i, opArgs) {
|
foreach (Strings::iterator, i, opArgs) {
|
||||||
Path path = useDeriver(followLinksToStorePath(*i));
|
Path path = useDeriver(followLinksToStorePath(*i));
|
||||||
|
|
||||||
Path logPath = (format("%1%/%2%/%3%") %
|
for (int j = 0; j < 2; j++) {
|
||||||
settings.nixLogDir % drvsLogDir % baseNameOf(path)).str();
|
if (j == 2) throw Error(format("build log of derivation `%1%' is not available") % path);
|
||||||
Path logBz2Path = logPath + ".bz2";
|
|
||||||
|
|
||||||
if (pathExists(logPath)) {
|
string baseName = baseNameOf(path);
|
||||||
/* !!! Make this run in O(1) memory. */
|
Path logPath =
|
||||||
string log = readFile(logPath);
|
j == 0
|
||||||
writeFull(STDOUT_FILENO, (const unsigned char *) log.data(), log.size());
|
? (format("%1%/%2%/%3%/%4%") % settings.nixLogDir % drvsLogDir % string(baseName, 0, 2) % string(baseName, 2)).str()
|
||||||
|
: (format("%1%/%2%/%3%") % settings.nixLogDir % drvsLogDir % baseName).str();
|
||||||
|
Path logBz2Path = logPath + ".bz2";
|
||||||
|
|
||||||
|
if (pathExists(logPath)) {
|
||||||
|
/* !!! Make this run in O(1) memory. */
|
||||||
|
string log = readFile(logPath);
|
||||||
|
writeFull(STDOUT_FILENO, (const unsigned char *) log.data(), log.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (pathExists(logBz2Path)) {
|
||||||
|
AutoCloseFD fd = open(logBz2Path.c_str(), O_RDONLY);
|
||||||
|
FILE * f = 0;
|
||||||
|
if (fd == -1 || (f = fdopen(fd.borrow(), "r")) == 0)
|
||||||
|
throw SysError(format("opening file `%1%'") % logBz2Path);
|
||||||
|
int err;
|
||||||
|
BZFILE * bz = BZ2_bzReadOpen(&err, f, 0, 0, 0, 0);
|
||||||
|
if (!bz) throw Error(format("cannot open bzip2 file `%1%'") % logBz2Path);
|
||||||
|
unsigned char buf[128 * 1024];
|
||||||
|
do {
|
||||||
|
int n = BZ2_bzRead(&err, bz, buf, sizeof(buf));
|
||||||
|
if (err != BZ_OK && err != BZ_STREAM_END)
|
||||||
|
throw Error(format("error reading bzip2 file `%1%'") % logBz2Path);
|
||||||
|
writeFull(STDOUT_FILENO, buf, n);
|
||||||
|
} while (err != BZ_STREAM_END);
|
||||||
|
BZ2_bzReadClose(&err, bz);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (pathExists(logBz2Path)) {
|
|
||||||
AutoCloseFD fd = open(logBz2Path.c_str(), O_RDONLY);
|
|
||||||
FILE * f = 0;
|
|
||||||
if (fd == -1 || (f = fdopen(fd.borrow(), "r")) == 0)
|
|
||||||
throw SysError(format("opening file `%1%'") % logBz2Path);
|
|
||||||
int err;
|
|
||||||
BZFILE * bz = BZ2_bzReadOpen(&err, f, 0, 0, 0, 0);
|
|
||||||
if (!bz) throw Error(format("cannot open bzip2 file `%1%'") % logBz2Path);
|
|
||||||
unsigned char buf[128 * 1024];
|
|
||||||
do {
|
|
||||||
int n = BZ2_bzRead(&err, bz, buf, sizeof(buf));
|
|
||||||
if (err != BZ_OK && err != BZ_STREAM_END)
|
|
||||||
throw Error(format("error reading bzip2 file `%1%'") % logBz2Path);
|
|
||||||
writeFull(STDOUT_FILENO, buf, n);
|
|
||||||
} while (err != BZ_STREAM_END);
|
|
||||||
BZ2_bzReadClose(&err, bz);
|
|
||||||
}
|
|
||||||
|
|
||||||
else throw Error(format("build log of derivation `%1%' is not available") % path);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue