44 lines
1.9 KiB
Diff
44 lines
1.9 KiB
Diff
From 9315c29e4fdfa19c90bb483a364b017881f5cef7 Mon Sep 17 00:00:00 2001
|
|
From: huangkaibin <huangkaibin@huawei.com>
|
|
Date: Sat, 21 Apr 2018 17:18:19 +0800
|
|
Subject: [PATCH] systemd-core: Delay to restart when a service can not be
|
|
auto-restarted when there is one STOP_JOB for the service
|
|
|
|
When a service current has a STOP job has not scheduled yet,
|
|
and also if the service is already scheduled with an auto-restart
|
|
with restart-second configured as 0, the service will not be restarted successfully,
|
|
and systemd will go into an endless loop to restart the service.
|
|
This is because restart-second is 0 and timer task has higher priority than IO tasks when there priority
|
|
is same(both with 0), so the STOP job has no chance to be scheduled, and systemd will go into the endless loop
|
|
to handle the time task.
|
|
This patch fix this problem by delaying 1 second to restart the service to cause STOP job to be scheduled.
|
|
---
|
|
src/core/service.c | 4 +++-
|
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/core/service.c b/src/core/service.c
|
|
index 340b655059..fba3b3a3f1 100644
|
|
--- a/src/core/service.c
|
|
+++ b/src/core/service.c
|
|
@@ -2264,6 +2264,7 @@ fail:
|
|
static void service_enter_restart(Service *s) {
|
|
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
|
int r;
|
|
+ int restart_usec;
|
|
|
|
assert(s);
|
|
|
|
@@ -2271,7 +2272,8 @@ static void service_enter_restart(Service *s) {
|
|
/* Don't restart things if we are going down anyway */
|
|
log_unit_info(UNIT(s), "Stop job pending for unit, delaying automatic restart.");
|
|
|
|
- r = service_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->restart_usec));
|
|
+ restart_usec = (s->restart_usec == 0) ? 1*USEC_PER_SEC : s->restart_usec;
|
|
+ r = service_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), restart_usec));
|
|
if (r < 0)
|
|
goto fail;
|
|
|
|
--
|
|
2.23.0
|
|
|