summaryrefslogtreecommitdiff
path: root/src/core/service.c
diff options
context:
space:
mode:
authorDavid Ward <david.ward@ll.mit.edu>2012-04-29 09:35:51 -0400
committerLennart Poettering <lennart@poettering.net>2012-05-22 01:57:21 +0200
commit2e9d6c1251abc0af9aa5bc53610bd522d55be776 (patch)
tree65dd1e3cb615986285964e1ffbfe5b835b1feba6 /src/core/service.c
parentf0c7b229e1aba12488ffb3ca39f606cc93291f55 (diff)
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.
Diffstat (limited to 'src/core/service.c')
-rw-r--r--src/core/service.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/core/service.c b/src/core/service.c
index 9512e0e98d..5d82e9b545 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -2436,7 +2436,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);