1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-25 23:21:33 +03:00

core: synchronously block when logging

Previously, the logging sockets were asynchronous and if clogged we'd
lose messages. We did this to be extra careful given that PID 1 might
need to spawn the logging daemon as response to PID 1's own log messages
and we really should avoid a deadlock in that case.

As it turns out this causes loss of too many messages, hence make the
socket blocking again, however put a time limit on it to avoid unbounded
deadlocks in the unlikely case they happen.

https://bugs.freedesktop.org/show_bug.cgi?id=66664
This commit is contained in:
Lennart Poettering 2013-07-24 07:24:05 +02:00
parent 41f1a1da57
commit 8b18fdc195

View File

@ -115,16 +115,20 @@ void log_close_syslog(void) {
static int create_log_socket(int type) { static int create_log_socket(int type) {
int fd; int fd;
struct timeval tv;
/* All output to the syslog/journal fds we do asynchronously, fd = socket(AF_UNIX, type|SOCK_CLOEXEC, 0);
* and if the buffers are full we just drop the messages */
fd = socket(AF_UNIX, type|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
if (fd < 0) if (fd < 0)
return -errno; return -errno;
fd_inc_sndbuf(fd, SNDBUF_SIZE); fd_inc_sndbuf(fd, SNDBUF_SIZE);
/* We need a blocking fd here since we'd otherwise lose
messages way too early. However, let's not hang forever in the
unlikely case of a deadlock. */
timeval_store(&tv, 1*USEC_PER_MINUTE);
setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
return fd; return fd;
} }