From 611541ebb727d4e34fc07a399be4dde24e9289e3 Mon Sep 17 00:00:00 2001 From: David Ward Date: Sun, 29 Apr 2012 09:35:51 -0400 Subject: [PATCH] service: fix auto-restart handling in service_start() Do not bypass the SERVICE_DEAD/SERVICE_FAILED state by manually issuing a start job while an automatic restart is pending. --- src/core/service.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) diff --git a/src/core/service.c b/src/core/service.c index 5aa1c0f..3400b55 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -2424,7 +2424,16 @@ static int service_start(Unit *u) { s->state == SERVICE_START_POST) return 0; - assert(s->state == SERVICE_DEAD || s->state == SERVICE_FAILED || s->state == SERVICE_AUTO_RESTART); + /* A service that will be restarted must be stopped first to + * trigger BindTo and/or OnFailure dependencies. If a user + * does not want to wait for the holdoff time to elapse, the + * service should be manually restarted, not started. */ + if (s->state == SERVICE_AUTO_RESTART) { + log_warning("%s automatic restart is pending, must be stopped before issuing start request.", UNIT(s)->id); + return -ECANCELED; + } + + assert(s->state == SERVICE_DEAD || s->state == SERVICE_FAILED); /* Make sure we don't enter a busy loop of some kind. */ r = service_start_limit_test(s); -- 1.7.1