Skip to content

Commit 724b7f4

Browse files
committed
Don't log from inside the logger
This deadlocks ProgressBar, e.g. # nix run --impure --no-substitute --store '/tmp/nix2?store=/foo' --expr 'derivation { builder = /nix/store/zi90rxslsm4mlr46l2xws1rm94g7pk8p-busybox-1.31.1-x86_64-unknown-linux-musl/bin/busybox; }' leads to Thread 1 (Thread 0x7ffff6126e80 (LWP 12250)): #0 0x00007ffff7215d62 in __lll_lock_wait () from /nix/store/9df65igwjmf2wbw0gbrrgair6piqjgmi-glibc-2.31/lib/libpthread.so.0 #1 0x00007ffff720e721 in pthread_mutex_lock () from /nix/store/9df65igwjmf2wbw0gbrrgair6piqjgmi-glibc-2.31/lib/libpthread.so.0 #2 0x00007ffff7ad17fa in __gthread_mutex_lock (__mutex=0x6c5448) at /nix/store/h31cy7jm6g7cfqbhc5pm4rf9c53i3qfb-gcc-9.3.0/include/c++/9.3.0/x86_64-unknown-linux-gnu/bits/gthr-default.h:749 #3 std::mutex::lock (this=0x6c5448) at /nix/store/h31cy7jm6g7cfqbhc5pm4rf9c53i3qfb-gcc-9.3.0/include/c++/9.3.0/bits/std_mutex.h:100 #4 std::unique_lock<std::mutex>::lock (this=0x7fffffff09a8, this=0x7fffffff09a8) at /nix/store/h31cy7jm6g7cfqbhc5pm4rf9c53i3qfb-gcc-9.3.0/include/c++/9.3.0/bits/unique_lock.h:141 #5 std::unique_lock<std::mutex>::unique_lock (__m=..., this=0x7fffffff09a8) at /nix/store/h31cy7jm6g7cfqbhc5pm4rf9c53i3qfb-gcc-9.3.0/include/c++/9.3.0/bits/unique_lock.h:71 #6 nix::Sync<nix::ProgressBar::State, std::mutex>::Lock::Lock (s=0x6c5448, this=0x7fffffff09a0) at src/libutil/sync.hh:45 #7 nix::Sync<nix::ProgressBar::State, std::mutex>::lock (this=0x6c5448) at src/libutil/sync.hh:85 #8 nix::ProgressBar::logEI (this=0x6c5440, ei=...) at src/libmain/progress-bar.cc:131 #9 0x00007ffff7608cfd in nix::Logger::logEI (ei=..., lvl=nix::lvlError, this=0x6c5440) at src/libutil/logging.hh:88 #10 nix::getCodeLines (errPos=...) at src/libutil/error.cc:66 #11 0x00007ffff76073f2 in nix::showErrorInfo (out=..., einfo=..., showTrace=<optimized out>) at /nix/store/h31cy7jm6g7cfqbhc5pm4rf9c53i3qfb-gcc-9.3.0/include/c++/9.3.0/optional:897 #12 0x00007ffff7ad19e7 in nix::ProgressBar::logEI (this=0x6c5440, ei=...) at src/libmain/progress-bar.cc:134 #13 0x00007ffff7ab9d10 in nix::Logger::logEI (ei=..., lvl=nix::lvlError, this=0x6c5440) at src/libutil/logging.hh:88 #14 nix::handleExceptions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void ()>) (programName="/home/eelco/Dev/nix/outputs/out/bin/nix", fun=...) at src/libmain/shared.cc:328 #15 0x000000000046226b in main (argc=<optimized out>, argv=<optimized out>) at /nix/store/h31cy7jm6g7cfqbhc5pm4rf9c53i3qfb-gcc-9.3.0/include/c++/9.3.0/ext/new_allocator.h:80
1 parent 9fab14a commit 724b7f4

File tree

1 file changed

+21
-29
lines changed

1 file changed

+21
-29
lines changed

Diff for: src/libutil/error.cc

+21-29
Original file line numberDiff line numberDiff line change
@@ -62,35 +62,28 @@ std::optional<LinesOfCode> getCodeLines(const ErrPos & errPos)
6262
LinesOfCode loc;
6363
try {
6464
AutoCloseFD fd = open(errPos.file.c_str(), O_RDONLY | O_CLOEXEC);
65-
if (!fd) {
66-
logError(SysError("opening file '%1%'", errPos.file).info());
67-
return std::nullopt;
68-
}
69-
else
65+
if (!fd) return {};
66+
67+
// count the newlines.
68+
int count = 0;
69+
string line;
70+
int pl = errPos.line - 1;
71+
do
7072
{
71-
// count the newlines.
72-
int count = 0;
73-
string line;
74-
int pl = errPos.line - 1;
75-
do
76-
{
77-
line = readLine(fd.get());
78-
++count;
79-
if (count < pl)
80-
{
81-
;
82-
}
83-
else if (count == pl) {
84-
loc.prevLineOfCode = line;
85-
} else if (count == pl + 1) {
86-
loc.errLineOfCode = line;
87-
} else if (count == pl + 2) {
88-
loc.nextLineOfCode = line;
89-
break;
90-
}
91-
} while (true);
92-
return loc;
93-
}
73+
line = readLine(fd.get());
74+
++count;
75+
if (count < pl)
76+
;
77+
else if (count == pl)
78+
loc.prevLineOfCode = line;
79+
else if (count == pl + 1)
80+
loc.errLineOfCode = line;
81+
else if (count == pl + 2) {
82+
loc.nextLineOfCode = line;
83+
break;
84+
}
85+
} while (true);
86+
return loc;
9487
}
9588
catch (EndOfFile & eof) {
9689
if (loc.errLineOfCode.has_value())
@@ -99,7 +92,6 @@ std::optional<LinesOfCode> getCodeLines(const ErrPos & errPos)
9992
return std::nullopt;
10093
}
10194
catch (std::exception & e) {
102-
printError("error reading nix file: %s\n%s", errPos.file, e.what());
10395
return std::nullopt;
10496
}
10597
} else {

0 commit comments

Comments
 (0)