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:
parent
41f1a1da57
commit
8b18fdc195
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user