1
0
mirror of https://github.com/systemd/systemd.git synced 2025-01-26 14:04:03 +03:00

update-utmp: wait slightly longer for the private bus socket being active

Before a339495b1d67f69f49ffffdd96002164a28f1c93, update-utmp typically
connects the public DBus socket when disconnected from the private DBus
socket, as dbus service should be active even during PID1 is being reexecuted.

However, after a339495b1d67f69f49ffffdd96002164a28f1c93, update-utmp
tries to connect only the private DBus socket, but reexecution of PID1
may be slow, hence all trials may fail when the reexecution is slow.

With this change, now it waits for 100ms to 2000ms, so in total it waits
about 37 seconds in average, previously about 4 seconds.
This commit is contained in:
Yu Watanabe 2024-10-26 23:28:32 +09:00
parent b7f84f76fc
commit f27ae592f7

View File

@ -65,6 +65,8 @@ static int get_startup_monotonic_time(Context *c, usec_t *ret) {
return 0;
}
#define MAX_ATTEMPTS 64u
static int get_current_runlevel(Context *c) {
static const struct {
const int runlevel;
@ -84,12 +86,13 @@ static int get_current_runlevel(Context *c) {
for (unsigned n_attempts = 0;;) {
if (n_attempts++ > 0) {
/* systemd might have dropped off momentarily, let's not make this an error,
* and wait some random time. Let's pick a random time in the range 0ms250ms,
* and wait some random time. Let's pick a random time in the range 100ms2000ms,
* linearly scaled by the number of failed attempts. */
c->bus = sd_bus_flush_close_unref(c->bus);
usec_t usec = random_u64_range(UINT64_C(10) * USEC_PER_MSEC +
UINT64_C(240) * USEC_PER_MSEC * n_attempts/64);
usec_t usec =
UINT64_C(100) * USEC_PER_MSEC +
random_u64_range(UINT64_C(1900) * USEC_PER_MSEC * n_attempts / MAX_ATTEMPTS);
(void) usleep_safe(usec);
r = bus_connect_system_systemd(&c->bus);
@ -121,7 +124,7 @@ static int get_current_runlevel(Context *c) {
sd_bus_error_has_names(&error,
SD_BUS_ERROR_NO_REPLY,
SD_BUS_ERROR_DISCONNECTED)) &&
n_attempts < 64) {
n_attempts < MAX_ATTEMPTS) {
log_debug_errno(r, "Failed to get state of %s, retrying after a slight delay: %s",
e->special, bus_error_message(&error, r));
break;