Merge pull request #1767 from poettering/journald-watchdog
restore journald watchdog
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
#include "cpu-set-util.h"
|
||||
#include "extract-word.h"
|
||||
#include "parse-util.h"
|
||||
#include "string-util.h"
|
||||
#include "util.h"
|
||||
|
||||
cpu_set_t* cpu_set_malloc(unsigned *ncpus) {
|
||||
|
||||
+15
-6
@@ -43,12 +43,6 @@
|
||||
#define SIGNALS_CRASH_HANDLER SIGSEGV,SIGILL,SIGFPE,SIGBUS,SIGQUIT,SIGABRT
|
||||
#define SIGNALS_IGNORE SIGPIPE
|
||||
|
||||
#define DIGITS "0123456789"
|
||||
#define LOWERCASE_LETTERS "abcdefghijklmnopqrstuvwxyz"
|
||||
#define UPPERCASE_LETTERS "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
#define LETTERS LOWERCASE_LETTERS UPPERCASE_LETTERS
|
||||
#define ALPHANUMERICAL LETTERS DIGITS
|
||||
|
||||
#define REBOOT_PARAM_FILE "/run/systemd/reboot-param"
|
||||
|
||||
#ifdef HAVE_SPLIT_USR
|
||||
@@ -81,3 +75,18 @@
|
||||
|
||||
#define NOTIFY_FD_MAX 768
|
||||
#define NOTIFY_BUFFER_MAX PIPE_BUF
|
||||
|
||||
/* Return a nulstr for a standard cascade of configuration directories,
|
||||
* suitable to pass to conf_files_list_nulstr or config_parse_many. */
|
||||
#define CONF_DIRS_NULSTR(n) \
|
||||
"/etc/" n ".d\0" \
|
||||
"/run/" n ".d\0" \
|
||||
"/usr/local/lib/" n ".d\0" \
|
||||
"/usr/lib/" n ".d\0" \
|
||||
CONF_DIR_SPLIT_USR(n)
|
||||
|
||||
#ifdef HAVE_SPLIT_USR
|
||||
#define CONF_DIR_SPLIT_USR(n) "/lib/" n ".d\0"
|
||||
#else
|
||||
#define CONF_DIR_SPLIT_USR(n)
|
||||
#endif
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "alloc-util.h"
|
||||
#include "escape.h"
|
||||
#include "hexdecoct.h"
|
||||
#include "string-util.h"
|
||||
#include "utf8.h"
|
||||
#include "util.h"
|
||||
|
||||
|
||||
@@ -21,9 +21,10 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "escape.h"
|
||||
#include "extract-word.h"
|
||||
#include "string-util.h"
|
||||
#include "utf8.h"
|
||||
#include "util.h"
|
||||
#include "extract-word.h"
|
||||
|
||||
int extract_first_word(const char **p, char **ret, const char *separators, ExtractFlags flags) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <glob.h>
|
||||
|
||||
#include "glob-util.h"
|
||||
#include "string-util.h"
|
||||
#include "strv.h"
|
||||
#include "util.h"
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "macro.h"
|
||||
#include "util.h"
|
||||
#include "string-util.h"
|
||||
|
||||
int glob_exists(const char *path);
|
||||
int glob_extend(char ***strv, const char *path);
|
||||
|
||||
@@ -334,21 +334,6 @@ static inline unsigned long ALIGN_POWER2(unsigned long u) {
|
||||
_found; \
|
||||
})
|
||||
|
||||
/* Return a nulstr for a standard cascade of configuration directories,
|
||||
* suitable to pass to conf_files_list_nulstr or config_parse_many. */
|
||||
#define CONF_DIRS_NULSTR(n) \
|
||||
"/etc/" n ".d\0" \
|
||||
"/run/" n ".d\0" \
|
||||
"/usr/local/lib/" n ".d\0" \
|
||||
"/usr/lib/" n ".d\0" \
|
||||
CONF_DIR_SPLIT_USR(n)
|
||||
|
||||
#ifdef HAVE_SPLIT_USR
|
||||
#define CONF_DIR_SPLIT_USR(n) "/lib/" n ".d\0"
|
||||
#else
|
||||
#define CONF_DIR_SPLIT_USR(n)
|
||||
#endif
|
||||
|
||||
/* Define C11 thread_local attribute even on older gcc compiler
|
||||
* version */
|
||||
#ifndef thread_local
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "macro.h"
|
||||
#include "util.h"
|
||||
#include "replace-var.h"
|
||||
#include "def.h"
|
||||
#include "string-util.h"
|
||||
#include "util.h"
|
||||
|
||||
/*
|
||||
* Generic infrastructure for replacing @FOO@ style variables in
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "gunicode.h"
|
||||
#include "string-util.h"
|
||||
#include "utf8.h"
|
||||
#include "util.h"
|
||||
#include "string-util.h"
|
||||
|
||||
int strcmp_ptr(const char *a, const char *b) {
|
||||
|
||||
|
||||
@@ -26,6 +26,18 @@
|
||||
|
||||
#include "macro.h"
|
||||
|
||||
/* What is interpreted as whitespace? */
|
||||
#define WHITESPACE " \t\n\r"
|
||||
#define NEWLINE "\n\r"
|
||||
#define QUOTES "\"\'"
|
||||
#define COMMENTS "#;"
|
||||
#define GLOB_CHARS "*?["
|
||||
#define DIGITS "0123456789"
|
||||
#define LOWERCASE_LETTERS "abcdefghijklmnopqrstuvwxyz"
|
||||
#define UPPERCASE_LETTERS "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
#define LETTERS LOWERCASE_LETTERS UPPERCASE_LETTERS
|
||||
#define ALPHANUMERICAL LETTERS DIGITS
|
||||
|
||||
#define streq(a,b) (strcmp((a),(b)) == 0)
|
||||
#define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
|
||||
#define strcaseeq(a,b) (strcasecmp((a),(b)) == 0)
|
||||
|
||||
@@ -44,13 +44,6 @@
|
||||
#include "missing.h"
|
||||
#include "time-util.h"
|
||||
|
||||
/* What is interpreted as whitespace? */
|
||||
#define WHITESPACE " \t\n\r"
|
||||
#define NEWLINE "\n\r"
|
||||
#define QUOTES "\"\'"
|
||||
#define COMMENTS "#;"
|
||||
#define GLOB_CHARS "*?["
|
||||
|
||||
size_t page_size(void) _pure_;
|
||||
#define PAGE_ALIGN(l) ALIGN_TO((l), page_size())
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "conf-files.h"
|
||||
#include "def.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "log.h"
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
#include "alloc-util.h"
|
||||
#include "bootchart.h"
|
||||
#include "conf-parser.h"
|
||||
#include "def.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "io-util.h"
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "conf-parser.h"
|
||||
#include "def.h"
|
||||
#include "escape.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "conf-parser.h"
|
||||
#include "def.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "formats-util.h"
|
||||
|
||||
@@ -1473,10 +1473,10 @@ static int dispatch_notify_event(sd_event_source *es, int fd, uint32_t revents,
|
||||
}
|
||||
|
||||
/* The $NOTIFY_SOCKET is writable again, now send exactly one
|
||||
* message on it. Either it's the initial READY=1 event or an
|
||||
* stdout stream event. If there's nothing to write anymore,
|
||||
* turn our event source off. The next time there's something
|
||||
* to send it will be turned on again. */
|
||||
* message on it. Either it's the wtachdog event, the initial
|
||||
* READY=1 event or an stdout stream event. If there's nothing
|
||||
* to write anymore, turn our event source off. The next time
|
||||
* there's something to send it will be turned on again. */
|
||||
|
||||
if (!s->sent_notify_ready) {
|
||||
static const char p[] =
|
||||
@@ -1495,12 +1495,30 @@ static int dispatch_notify_event(sd_event_source *es, int fd, uint32_t revents,
|
||||
s->sent_notify_ready = true;
|
||||
log_debug("Sent READY=1 notification.");
|
||||
|
||||
} else if (s->send_watchdog) {
|
||||
|
||||
static const char p[] =
|
||||
"WATCHDOG=1";
|
||||
|
||||
ssize_t l;
|
||||
|
||||
l = send(s->notify_fd, p, strlen(p), MSG_DONTWAIT);
|
||||
if (l < 0) {
|
||||
if (errno == EAGAIN)
|
||||
return 0;
|
||||
|
||||
return log_error_errno(errno, "Failed to send WATCHDOG=1 notification message: %m");
|
||||
}
|
||||
|
||||
s->send_watchdog = false;
|
||||
log_debug("Sent WATCHDOG=1 notification.");
|
||||
|
||||
} else if (s->stdout_streams_notify_queue)
|
||||
/* Dispatch one stream notification event */
|
||||
stdout_stream_send_notify(s->stdout_streams_notify_queue);
|
||||
|
||||
/* Leave us enabled if there's still more to to do. */
|
||||
if (s->stdout_streams_notify_queue)
|
||||
if (s->send_watchdog || s->stdout_streams_notify_queue)
|
||||
return 0;
|
||||
|
||||
/* There was nothing to do anymore, let's turn ourselves off. */
|
||||
@@ -1511,6 +1529,29 @@ static int dispatch_notify_event(sd_event_source *es, int fd, uint32_t revents,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dispatch_watchdog(sd_event_source *es, uint64_t usec, void *userdata) {
|
||||
Server *s = userdata;
|
||||
int r;
|
||||
|
||||
assert(s);
|
||||
|
||||
s->send_watchdog = true;
|
||||
|
||||
r = sd_event_source_set_enabled(s->notify_event_source, SD_EVENT_ON);
|
||||
if (r < 0)
|
||||
log_warning_errno(r, "Failed to turn on notify event source: %m");
|
||||
|
||||
r = sd_event_source_set_time(s->watchdog_event_source, usec + s->watchdog_usec / 2);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to restart watchdog event source: %m");
|
||||
|
||||
r = sd_event_source_set_enabled(s->watchdog_event_source, SD_EVENT_ON);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to enable watchdog event source: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int server_connect_notify(Server *s) {
|
||||
union sockaddr_union sa = {
|
||||
.un.sun_family = AF_UNIX,
|
||||
@@ -1573,6 +1614,14 @@ static int server_connect_notify(Server *s) {
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to watch notification socket: %m");
|
||||
|
||||
if (sd_watchdog_enabled(false, &s->watchdog_usec) > 0) {
|
||||
s->send_watchdog = true;
|
||||
|
||||
r = sd_event_add_time(s->event, &s->watchdog_event_source, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + s->watchdog_usec/2, s->watchdog_usec*3/4, dispatch_watchdog, s);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add watchdog time event: %m");
|
||||
}
|
||||
|
||||
/* This should fire pretty soon, which we'll use to send the
|
||||
* READY=1 event. */
|
||||
|
||||
@@ -1591,6 +1640,8 @@ int server_init(Server *s) {
|
||||
s->compress = true;
|
||||
s->seal = true;
|
||||
|
||||
s->watchdog_usec = USEC_INFINITY;
|
||||
|
||||
s->sync_interval_usec = DEFAULT_SYNC_INTERVAL_USEC;
|
||||
s->sync_scheduled = false;
|
||||
|
||||
@@ -1808,6 +1859,7 @@ void server_done(Server *s) {
|
||||
sd_event_source_unref(s->sigint_event_source);
|
||||
sd_event_source_unref(s->hostname_event_source);
|
||||
sd_event_source_unref(s->notify_event_source);
|
||||
sd_event_source_unref(s->watchdog_event_source);
|
||||
sd_event_unref(s->event);
|
||||
|
||||
safe_close(s->syslog_fd);
|
||||
|
||||
@@ -74,6 +74,7 @@ struct Server {
|
||||
sd_event_source *sigint_event_source;
|
||||
sd_event_source *hostname_event_source;
|
||||
sd_event_source *notify_event_source;
|
||||
sd_event_source *watchdog_event_source;
|
||||
|
||||
JournalFile *runtime_journal;
|
||||
JournalFile *system_journal;
|
||||
@@ -130,14 +131,14 @@ struct Server {
|
||||
|
||||
MMapCache *mmap;
|
||||
|
||||
bool dev_kmsg_readable;
|
||||
|
||||
uint64_t *kernel_seqnum;
|
||||
|
||||
struct udev *udev;
|
||||
|
||||
bool sent_notify_ready;
|
||||
bool sync_scheduled;
|
||||
uint64_t *kernel_seqnum;
|
||||
bool dev_kmsg_readable:1;
|
||||
|
||||
bool send_watchdog:1;
|
||||
bool sent_notify_ready:1;
|
||||
bool sync_scheduled:1;
|
||||
|
||||
char machine_id_field[sizeof("_MACHINE_ID=") + 32];
|
||||
char boot_id_field[sizeof("_BOOT_ID=") + 32];
|
||||
@@ -145,6 +146,8 @@ struct Server {
|
||||
|
||||
/* Cached cgroup root, so that we don't have to query that all the time */
|
||||
char *cgroup_root;
|
||||
|
||||
usec_t watchdog_usec;
|
||||
};
|
||||
|
||||
#define SERVER_MACHINE_ID(s) ((s)->machine_id_field + strlen("_MACHINE_ID="))
|
||||
|
||||
@@ -32,11 +32,12 @@
|
||||
#include "dns-domain.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "hexdecoct.h"
|
||||
#include "hostname-util.h"
|
||||
#include "in-addr-util.h"
|
||||
#include "network-internal.h"
|
||||
#include "hexdecoct.h"
|
||||
#include "parse-util.h"
|
||||
#include "string-util.h"
|
||||
#include "unaligned.h"
|
||||
|
||||
int sd_dhcp_lease_get_address(sd_dhcp_lease *lease, struct in_addr *addr) {
|
||||
|
||||
@@ -586,7 +586,7 @@ _public_ int sd_watchdog_enabled(int unset_environment, uint64_t *usec) {
|
||||
r = safe_atou64(s, &u);
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
if (u <= 0) {
|
||||
if (u <= 0 || u >= USEC_INFINITY) {
|
||||
r = -EINVAL;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "bus-error.h"
|
||||
#include "bus-util.h"
|
||||
#include "conf-parser.h"
|
||||
#include "def.h"
|
||||
#include "dirent-util.h"
|
||||
#include "fd-util.h"
|
||||
#include "formats-util.h"
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "conf-files.h"
|
||||
#include "def.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "log.h"
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "conf-parser.h"
|
||||
#include "def.h"
|
||||
#include "extract-word.h"
|
||||
#include "parse-util.h"
|
||||
#include "resolved-conf.h"
|
||||
|
||||
@@ -23,14 +23,15 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "conf-parser.h"
|
||||
#include "def.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "log.h"
|
||||
#include "parse-util.h"
|
||||
#include "sleep-config.h"
|
||||
#include "string-util.h"
|
||||
#include "strv.h"
|
||||
#include "util.h"
|
||||
#include "parse-util.h"
|
||||
|
||||
#define USE(x, y) do{ (x) = (y); (y) = NULL; } while(0)
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "conf-files.h"
|
||||
#include "def.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "hashmap.h"
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
#include "alloc-util.h"
|
||||
#include "conf-files.h"
|
||||
#include "copy.h"
|
||||
#include "def.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio-label.h"
|
||||
#include "formats-util.h"
|
||||
#include "hashmap.h"
|
||||
@@ -39,10 +41,9 @@
|
||||
#include "string-util.h"
|
||||
#include "strv.h"
|
||||
#include "uid-range.h"
|
||||
#include "user-util.h"
|
||||
#include "utf8.h"
|
||||
#include "util.h"
|
||||
#include "fd-util.h"
|
||||
#include "user-util.h"
|
||||
|
||||
typedef enum ItemType {
|
||||
ADD_USER = 'u',
|
||||
|
||||
@@ -20,11 +20,12 @@
|
||||
***/
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "def.h"
|
||||
#include "extract-word.h"
|
||||
#include "string-util.h"
|
||||
#include "timesyncd-conf.h"
|
||||
#include "timesyncd-manager.h"
|
||||
#include "timesyncd-server.h"
|
||||
#include "timesyncd-conf.h"
|
||||
#include "extract-word.h"
|
||||
|
||||
int manager_parse_server_string(Manager *m, ServerType type, const char *string) {
|
||||
ServerName *first;
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
#include "chattr-util.h"
|
||||
#include "conf-files.h"
|
||||
#include "copy.h"
|
||||
#include "def.h"
|
||||
#include "escape.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
|
||||
@@ -22,6 +22,7 @@ RestartSec=0
|
||||
NotifyAccess=all
|
||||
StandardOutput=null
|
||||
CapabilityBoundingSet=CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_SYS_PTRACE CAP_SYSLOG CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_CHOWN CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_MAC_OVERRIDE
|
||||
WatchdogSec=3min
|
||||
FileDescriptorStoreMax=1024
|
||||
|
||||
# Increase the default a bit in order to allow many simultaneous
|
||||
|
||||
Reference in New Issue
Block a user