summaryrefslogtreecommitdiff
path: root/delay-to-restart-when-a-service-can-not-be-auto-restarted.patch
diff options
context:
space:
mode:
Diffstat (limited to 'delay-to-restart-when-a-service-can-not-be-auto-restarted.patch')
-rw-r--r--delay-to-restart-when-a-service-can-not-be-auto-restarted.patch47
1 files changed, 47 insertions, 0 deletions
diff --git a/delay-to-restart-when-a-service-can-not-be-auto-restarted.patch b/delay-to-restart-when-a-service-can-not-be-auto-restarted.patch
new file mode 100644
index 0000000..d0883d7
--- /dev/null
+++ b/delay-to-restart-when-a-service-can-not-be-auto-restarted.patch
@@ -0,0 +1,47 @@
+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 | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/src/core/service.c b/src/core/service.c
+index b9eb40c..47e9d63 100644
+--- a/src/core/service.c
++++ b/src/core/service.c
+@@ -2507,13 +2507,20 @@ 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);
+
+ if (unit_has_job_type(UNIT(s), JOB_STOP)) {
+ /* Don't restart things if we are going down anyway */
+ log_unit_info(UNIT(s), "Stop job pending for unit, skipping automatic restart.");
+- return;
++ restart_usec = (s->restart_usec == 0) ? 1*USEC_PER_SEC : s->restart_usec;
++ r = service_arm_timer(s, /* relative= */ false, usec_add(now(CLOCK_MONOTONIC), restart_usec));
++ if (r < 0) {
++ log_unit_warning(UNIT(s), "Failed to schedule restart job: %s", bus_error_message(&error, r));
++ service_enter_dead(s, SERVICE_FAILURE_RESOURCES, /* allow_restart= */ false);
++ return;
++ }
+ }
+
+ /* Any units that are bound to this service must also be restarted. We use JOB_START for ourselves
+--
+2.33.0
+