[systemd-devel] [PATCH] service: fix auto-restart handling in service_stop()
David Ward
david.ward at ll.mit.edu
Mon Apr 30 14:57:23 PDT 2012
When service_stop() handles a service in the SERVICE_AUTO_RESTART state,
it calls service_set_state() to transition it to the SERVICE_DEAD state.
However if the service failed, it should transition it to SERVICE_FAILED
instead, which will trigger its OnFailure units. To achieve this, we now
call service_enter_dead() in place of service_set_state(), which will
transition the service to either SERVICE_DEAD or SERVICE_FAILED as is
appropriate.
Also, some misleading comments are adjusted: service_stop() is not only
called on a user request, but also during an automatic restart in order
to handle dependencies.
Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=45511
---
src/core/service.c | 7 +++----
1 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/core/service.c b/src/core/service.c
index e9fbd6d..5aa1c0f 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -2448,8 +2448,7 @@ static int service_stop(Unit *u) {
assert(s);
- /* This is a user request, so don't do restarts on this
- * shutdown. */
+ /* Don't create restart jobs from here. */
s->forbid_restart = true;
/* Already on it */
@@ -2461,9 +2460,9 @@ static int service_stop(Unit *u) {
s->state == SERVICE_FINAL_SIGKILL)
return 0;
- /* Don't allow a restart */
+ /* A restart will be scheduled or is in progress. */
if (s->state == SERVICE_AUTO_RESTART) {
- service_set_state(s, SERVICE_DEAD);
+ service_enter_dead(s, SERVICE_SUCCESS, false);
return 0;
}
--
1.7.4.1
More information about the systemd-devel
mailing list