systemd/Retry-to-handle-the-uevent-when-worker-is-terminated.patch

88 lines
2.7 KiB
Diff
Raw Normal View History

2023-07-31 10:00:47 +08:00
From a3d2f4261ef9a953904e3e21abafba0dad7daa77 Mon Sep 17 00:00:00 2001
From: gaoyi <gaoyi15@huawei.com>
Date: Mon, 28 Sep 2020 22:36:37 +0800
Subject: [PATCH] Retry to handle the uevent when worker is terminated abnormal
When processing uevent events fails, retry it.
---
2024-01-08 19:20:01 +08:00
src/udev/udev-manager.c | 35 +++++++++++++++++++++++++++++++++--
2023-07-31 10:00:47 +08:00
1 file changed, 33 insertions(+), 2 deletions(-)
2024-01-08 19:20:01 +08:00
diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c
index 8077e51..88023c7 100644
--- a/src/udev/udev-manager.c
+++ b/src/udev/udev-manager.c
@@ -36,6 +36,7 @@
#include "udev-worker.h"
2023-07-31 10:00:47 +08:00
2024-01-08 19:20:01 +08:00
#define WORKER_NUM_MAX UINT64_C(2048)
2023-07-31 10:00:47 +08:00
+#define UEVENT_MAX_RETRY_TIMES 3
2024-01-08 19:20:01 +08:00
2023-07-31 10:00:47 +08:00
#define EVENT_RETRY_INTERVAL_USEC (200 * USEC_PER_MSEC)
#define EVENT_RETRY_TIMEOUT_USEC (3 * USEC_PER_MINUTE)
2024-01-08 19:20:01 +08:00
@@ -50,6 +51,7 @@ typedef struct Event {
2023-07-31 10:00:47 +08:00
Manager *manager;
Worker *worker;
EventState state;
+ int retry;
sd_device *dev;
2024-01-08 19:20:01 +08:00
@@ -89,6 +91,32 @@ typedef struct Worker {
Event *event;
} Worker;
2023-07-31 10:00:47 +08:00
+static bool event_retry(Event *event) {
+ if (!event)
+ return false;
+
+ assert(event->manager);
+
+ if (--event->retry < 0) {
+ log_device_error(event->dev, "Retry failed.");
+ return false;
+ }
+
+ log_device_info(event->dev, "Retry %d times.", UEVENT_MAX_RETRY_TIMES - event->retry);
+
+ event->timeout_warning_event = sd_event_source_unref(event->timeout_warning_event);
+ event->timeout_event = sd_event_source_unref(event->timeout_event);
+
+ if (event->worker) {
+ event->worker->event = NULL;
+ event->worker = NULL;
+ }
+
+ event->state = EVENT_QUEUED;
+
+ return true;
+}
+
static Event *event_free(Event *event) {
if (!event)
return NULL;
2024-01-08 19:20:01 +08:00
@@ -735,6 +763,7 @@ static int event_queue_insert(Manager *manager, sd_device *dev) {
2023-07-31 10:00:47 +08:00
.devpath_old = devpath_old,
.devnode = devnode,
.state = EVENT_QUEUED,
+ .retry = UEVENT_MAX_RETRY_TIMES,
};
if (!manager->events) {
2024-01-08 19:20:01 +08:00
@@ -1126,8 +1155,10 @@ static int on_sigchld(sd_event_source *s, const siginfo_t *si, void *userdata) {
2023-07-31 10:00:47 +08:00
device_delete_db(dev);
device_tag_index(dev, NULL, false);
- /* Forward kernel event to libudev listeners */
2024-01-08 19:20:01 +08:00
- udev_broadcast_result(manager->monitor, dev, result);
2023-07-31 10:00:47 +08:00
+ if (event_retry(worker->event) == false) {
+ /* Forward kernel event to libudev listeners */
2024-01-08 19:20:01 +08:00
+ udev_broadcast_result(manager->monitor, dev, result);
2023-07-31 10:00:47 +08:00
+ }
}
worker_free(worker);
--
2.33.0