Projects
Mega:23.03
systemd
_service:tar_scm:backport-udev-node-add-random-...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:backport-udev-node-add-random-delay-on-conflict-in-updating-d.patch of Package systemd
From fca1dafcc29f123aadfd8a2bc5ebfc2468284a6a Mon Sep 17 00:00:00 2001 From: Yu Watanabe <watanabe.yu+github@gmail.com> Date: Wed, 1 Sep 2021 04:34:48 +0900 Subject: [PATCH] udev-node: add random delay on conflict in updating device node symlink To make multiple workers not update the same device node symlink simultaneously. (cherry picked from commit 0063fa23a1384dd4385d03b568dc629916b7e72a) Conflict:NA Reference:https://github.com/systemd/systemd-stable/commit/fca1dafcc29f123aadfd8a2bc5ebfc2468284a6a --- src/udev/udev-node.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/udev/udev-node.c b/src/udev/udev-node.c index 2e7df899e4..d8edf39aec 100644 --- a/src/udev/udev-node.c +++ b/src/udev/udev-node.c @@ -20,12 +20,14 @@ #include "mkdir.h" #include "parse-util.h" #include "path-util.h" +#include "random-util.h" #include "selinux-util.h" #include "smack-util.h" #include "stat-util.h" #include "stdio-util.h" #include "string-util.h" #include "strxcpyx.h" +#include "time-util.h" #include "udev-node.h" #include "user-util.h" @@ -33,6 +35,8 @@ #define LINK_UPDATE_MAX_RETRIES 128 #define CREATE_STACK_LINK_MAX_RETRIES 128 #define UPDATE_TIMESTAMP_MAX_RETRIES 128 +#define MAX_RANDOM_DELAY (250 * USEC_PER_MSEC) +#define MIN_RANDOM_DELAY ( 50 * USEC_PER_MSEC) #define UDEV_NODE_HASH_KEY SD_ID128_MAKE(b9,6a,f1,ce,40,31,44,1a,9e,19,ec,8b,ae,f3,e3,2f) static int create_symlink(const char *target, const char *slink) { @@ -447,6 +451,15 @@ static int link_update(sd_device *dev, const char *slink_in, bool add) { _cleanup_free_ char *target = NULL; struct stat st1 = {}, st2 = {}; + if (i > 0) { + char buf[FORMAT_TIMESPAN_MAX]; + usec_t delay = MIN_RANDOM_DELAY + random_u64_range(MAX_RANDOM_DELAY - MIN_RANDOM_DELAY); + + log_device_debug(dev, "Directory %s was updated, retrying to update devlink %s after %s.", + dirname, slink, format_timespan(buf, sizeof(buf), delay, USEC_PER_MSEC)); + (void) usleep(delay); + } + if (stat(dirname, &st1) < 0 && errno != ENOENT) return log_device_debug_errno(dev, errno, "Failed to stat %s: %m", dirname); -- 2.33.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2