mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-24 21:34:08 +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:
parent
41f1a1da57
commit
8b18fdc195
@ -115,16 +115,20 @@ void log_close_syslog(void) {
|
||||
|
||||
static int create_log_socket(int type) {
|
||||
int fd;
|
||||
struct timeval tv;
|
||||
|
||||
/* All output to the syslog/journal fds we do asynchronously,
|
||||
* and if the buffers are full we just drop the messages */
|
||||
|
||||
fd = socket(AF_UNIX, type|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
|
||||
fd = socket(AF_UNIX, type|SOCK_CLOEXEC, 0);
|
||||
if (fd < 0)
|
||||
return -errno;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user