bed1e46362
Backport the patches for this issue: https://bugzilla.redhat.com/show_bug.cgi?id=1968528 It reports: The fix for Bug 1819868 has introduced a new issue related to its implementation of rate limiting. Rate limiting the mount_event_source can cause unmount events to be missed, which leads to mount unit cgroups being leaked (not cleaned up when the mount is gone). The fix for 1968528 can fix the issue we met: During the reboot process of subclouds (either lock-unlock or sudo reboot), unmounting failure messages repeat for a few hundred of times. The patches are listed at: https://github.com/redhat-plumbers/systemd-rhel8/pull/198/commits And they are picked from https://github.com/systemd-rhel/rhel-8/ (branch rhel-8.4.0). Verification: In my test on an AIO-SX lab, the bug appears as: run "sudo reboot" on controller, endless unmounting failure logs printed. Verified that the problem was there during the shutdown phase of a reboot. Reinstalled with a fixed image, and verified that the issue was now gone by doing 5 reboots. Ran sanity on the lab, and verified no new issues seen. Closes-Bug: #1948899 Signed-off-by: Li Zhou <li.zhou@windriver.com> Change-Id: If95932ceead1bea973f2219d3a8d6b04cf0fd5f8
105 lines
3.9 KiB
Diff
105 lines
3.9 KiB
Diff
From 762ba1d9cd3571f294965cb86525999e81fdec5d Mon Sep 17 00:00:00 2001
|
|
From: Lennart Poettering <lennart@poettering.net>
|
|
Date: Tue, 8 Jun 2021 00:07:51 -0700
|
|
Subject: [PATCH 1/6] sd-event: change ordering of pending/ratelimited events
|
|
|
|
Instead of ordering non-pending before pending we should order
|
|
"non-pending OR ratelimited" before "pending AND not-ratelimited".
|
|
This fixes a bug where ratelimited events were ordered at the end of the
|
|
priority queue and could be stuck there for an indeterminate amount of
|
|
time.
|
|
|
|
(cherry picked from commit 81107b8419c39f726fd2805517a5b9faab204e59)
|
|
|
|
Related: #1984406
|
|
|
|
[commit 93de7820843c175f4c9661dbfcb312e8ee09fbd3 from
|
|
https://github.com/systemd-rhel/rhel-8/ (branch rhel-8.4.0)]
|
|
|
|
Signed-off-by: Li Zhou <li.zhou@windriver.com>
|
|
---
|
|
src/libsystemd/sd-event/sd-event.c | 48 +++++++++++++-----------------
|
|
1 file changed, 20 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c
|
|
index 282b38f..fcf333e 100644
|
|
--- a/src/libsystemd/sd-event/sd-event.c
|
|
+++ b/src/libsystemd/sd-event/sd-event.c
|
|
@@ -352,25 +352,6 @@ static usec_t time_event_source_next(const sd_event_source *s) {
|
|
return USEC_INFINITY;
|
|
}
|
|
|
|
-static int earliest_time_prioq_compare(const void *a, const void *b) {
|
|
- const sd_event_source *x = a, *y = b;
|
|
-
|
|
- /* Enabled ones first */
|
|
- if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
|
|
- return -1;
|
|
- if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
|
|
- return 1;
|
|
-
|
|
- /* Move the pending ones to the end */
|
|
- if (!x->pending && y->pending)
|
|
- return -1;
|
|
- if (x->pending && !y->pending)
|
|
- return 1;
|
|
-
|
|
- /* Order by time */
|
|
- return CMP(time_event_source_next(x), time_event_source_next(y));
|
|
-}
|
|
-
|
|
static usec_t time_event_source_latest(const sd_event_source *s) {
|
|
assert(s);
|
|
|
|
@@ -389,7 +370,15 @@ static usec_t time_event_source_latest(const sd_event_source *s) {
|
|
return USEC_INFINITY;
|
|
}
|
|
|
|
-static int latest_time_prioq_compare(const void *a, const void *b) {
|
|
+static bool event_source_timer_candidate(const sd_event_source *s) {
|
|
+ assert(s);
|
|
+
|
|
+ /* Returns true for event sources that either are not pending yet (i.e. where it's worth to mark them pending)
|
|
+ * or which are currently ratelimited (i.e. where it's worth leaving the ratelimited state) */
|
|
+ return !s->pending || s->ratelimited;
|
|
+}
|
|
+
|
|
+static int time_prioq_compare(const void *a, const void *b, usec_t (*time_func)(const sd_event_source *s)) {
|
|
const sd_event_source *x = a, *y = b;
|
|
|
|
/* Enabled ones first */
|
|
@@ -398,19 +387,22 @@ static int latest_time_prioq_compare(const void *a, const void *b) {
|
|
if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
|
|
return 1;
|
|
|
|
- /* Move the pending ones to the end */
|
|
- if (!x->pending && y->pending)
|
|
+ /* Order "non-pending OR ratelimited" before "pending AND not-ratelimited" */
|
|
+ if (event_source_timer_candidate(x) && !event_source_timer_candidate(y))
|
|
return -1;
|
|
- if (x->pending && !y->pending)
|
|
+ if (!event_source_timer_candidate(x) && event_source_timer_candidate(y))
|
|
return 1;
|
|
|
|
/* Order by time */
|
|
- if (time_event_source_latest(x) < time_event_source_latest(y))
|
|
- return -1;
|
|
- if (time_event_source_latest(x) > time_event_source_latest(y))
|
|
- return 1;
|
|
+ return CMP(time_func(x), time_func(y));
|
|
+}
|
|
|
|
- return 0;
|
|
+static int earliest_time_prioq_compare(const void *a, const void *b) {
|
|
+ return time_prioq_compare(a, b, time_event_source_next);
|
|
+}
|
|
+
|
|
+static int latest_time_prioq_compare(const void *a, const void *b) {
|
|
+ return time_prioq_compare(a, b, time_event_source_latest);
|
|
}
|
|
|
|
static int exit_prioq_compare(const void *a, const void *b) {
|
|
--
|
|
2.17.1
|
|
|