service: kill processes with SIGKILL on watchdog failure

Just calling service_enter_dead() does not kill any processes.
As a result, the old process may still be running when the new one is
started.

After a watchdog failure the service is in an undefined state.
Using the normal shutdown mechanism makes no sense. Instead all processes
are just killed and the service can try to restart.
This commit is contained in:
Michael Olbrich
2013-05-21 09:23:51 -04:00
committed by Zbigniew Jędrzejewski-Szmek
parent 571bfc6c56
commit 9e9c3abcfa
+2 -4
View File
@@ -235,7 +235,7 @@ static void service_stop_watchdog(Service *s) {
s->watchdog_timestamp.monotonic = 0;
}
static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart);
static void service_enter_signal(Service *s, ServiceState state, ServiceResult f);
static void service_handle_watchdog(Service *s) {
usec_t offset;
@@ -249,7 +249,7 @@ static void service_handle_watchdog(Service *s) {
offset = now(CLOCK_MONOTONIC) - s->watchdog_timestamp.monotonic;
if (offset >= s->watchdog_usec) {
log_error_unit(UNIT(s)->id, "%s watchdog timeout!", UNIT(s)->id);
service_enter_dead(s, SERVICE_FAILURE_WATCHDOG, true);
service_enter_signal(s, SERVICE_FINAL_SIGKILL, SERVICE_FAILURE_WATCHDOG);
return;
}
@@ -1939,8 +1939,6 @@ fail:
service_enter_dead(s, SERVICE_FAILURE_RESOURCES, false);
}
static void service_enter_signal(Service *s, ServiceState state, ServiceResult f);
static void service_enter_stop_post(Service *s, ServiceResult f) {
int r;
assert(s);