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:
committed by
Zbigniew Jędrzejewski-Szmek
parent
571bfc6c56
commit
9e9c3abcfa
+2
-4
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user