From bc2277421d7455d29f1b80a2858f76a8da321d1eebc9e15aa9f82e03086f6e68 Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Tue, 2 Nov 2021 10:36:41 +0000 Subject: [PATCH] - Add 0001-Revert-core-Check-unit-start-rate-limiting-earlier.patch Temporarly revert commit ed8fbbf1745c6a2dc0b8cd560ac8a3353f72e979 until the regression it introduced [1] is addressed by upstream and a fix is released via the stable tree. [1] https://github.com/systemd/systemd/issues/21025 OBS-URL: https://build.opensuse.org/package/show/Base:System/systemd?expand=0&rev=1210 --- ...eck-unit-start-rate-limiting-earlier.patch | 486 ++++++++++++++++++ systemd.changes | 11 + systemd.spec | 1 + 3 files changed, 498 insertions(+) create mode 100644 0001-Revert-core-Check-unit-start-rate-limiting-earlier.patch diff --git a/0001-Revert-core-Check-unit-start-rate-limiting-earlier.patch b/0001-Revert-core-Check-unit-start-rate-limiting-earlier.patch new file mode 100644 index 00000000..379aaab3 --- /dev/null +++ b/0001-Revert-core-Check-unit-start-rate-limiting-earlier.patch @@ -0,0 +1,486 @@ +From 4fa9d8f14523982482386d398d2b2669902f2098 Mon Sep 17 00:00:00 2001 +From: Yu Watanabe +Date: Mon, 18 Oct 2021 14:11:53 +0900 +Subject: [PATCH 1/1] Revert "core: Check unit start rate limiting earlier" + +This reverts commit ed8fbbf1745c6a2dc0b8cd560ac8a3353f72e979. + +This was causing problems during boot, see +https://bodhi.fedoraproject.org/updates/FEDORA-2021-a1a52487e6, +https://bugzilla.redhat.com/show_bug.cgi?id=2013386. +https://github.com/systemd/systemd/issues/21025 +--- + src/core/automount.c | 23 ++++++----------------- + src/core/mount.c | 23 ++++++----------------- + src/core/path.c | 23 ++++++----------------- + src/core/service.c | 25 +++++++------------------ + src/core/socket.c | 23 ++++++----------------- + src/core/swap.c | 23 ++++++----------------- + src/core/timer.c | 23 ++++++----------------- + src/core/unit.c | 7 ------- + src/core/unit.h | 4 ---- + test/TEST-63-ISSUE-17433/Makefile | 1 - + test/TEST-63-ISSUE-17433/test.sh | 9 --------- + test/meson.build | 2 -- + test/testsuite-10.units/test10.service | 3 --- + test/testsuite-63.units/test63.path | 2 -- + test/testsuite-63.units/test63.service | 5 ----- + test/units/testsuite-63.service | 16 ---------------- + 16 files changed, 43 insertions(+), 169 deletions(-) + delete mode 120000 test/TEST-63-ISSUE-17433/Makefile + delete mode 100755 test/TEST-63-ISSUE-17433/test.sh + delete mode 100644 test/testsuite-63.units/test63.path + delete mode 100644 test/testsuite-63.units/test63.service + delete mode 100644 test/units/testsuite-63.service + +diff --git a/src/core/automount.c b/src/core/automount.c +index 0722abef23..edc9588165 100644 +--- a/src/core/automount.c ++++ b/src/core/automount.c +@@ -814,6 +814,12 @@ static int automount_start(Unit *u) { + if (r < 0) + return r; + ++ r = unit_test_start_limit(u); ++ if (r < 0) { ++ automount_enter_dead(a, AUTOMOUNT_FAILURE_START_LIMIT_HIT); ++ return r; ++ } ++ + r = unit_acquire_invocation_id(u); + if (r < 0) + return r; +@@ -1059,21 +1065,6 @@ static bool automount_supported(void) { + return supported; + } + +-static int automount_test_start_limit(Unit *u) { +- Automount *a = AUTOMOUNT(u); +- int r; +- +- assert(a); +- +- r = unit_test_start_limit(u); +- if (r < 0) { +- automount_enter_dead(a, AUTOMOUNT_FAILURE_START_LIMIT_HIT); +- return r; +- } +- +- return 0; +-} +- + static const char* const automount_result_table[_AUTOMOUNT_RESULT_MAX] = { + [AUTOMOUNT_SUCCESS] = "success", + [AUTOMOUNT_FAILURE_RESOURCES] = "resources", +@@ -1136,6 +1127,4 @@ const UnitVTable automount_vtable = { + [JOB_FAILED] = "Failed to unset automount %s.", + }, + }, +- +- .test_start_limit = automount_test_start_limit, + }; +diff --git a/src/core/mount.c b/src/core/mount.c +index 9bec190cb6..af39db214b 100644 +--- a/src/core/mount.c ++++ b/src/core/mount.c +@@ -1168,6 +1168,12 @@ static int mount_start(Unit *u) { + + assert(IN_SET(m->state, MOUNT_DEAD, MOUNT_FAILED)); + ++ r = unit_test_start_limit(u); ++ if (r < 0) { ++ mount_enter_dead(m, MOUNT_FAILURE_START_LIMIT_HIT); ++ return r; ++ } ++ + r = unit_acquire_invocation_id(u); + if (r < 0) + return r; +@@ -2137,21 +2143,6 @@ static int mount_can_clean(Unit *u, ExecCleanMask *ret) { + return exec_context_get_clean_mask(&m->exec_context, ret); + } + +-static int mount_test_start_limit(Unit *u) { +- Mount *m = MOUNT(u); +- int r; +- +- assert(m); +- +- r = unit_test_start_limit(u); +- if (r < 0) { +- mount_enter_dead(m, MOUNT_FAILURE_START_LIMIT_HIT); +- return r; +- } +- +- return 0; +-} +- + static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = { + [MOUNT_EXEC_MOUNT] = "ExecMount", + [MOUNT_EXEC_UNMOUNT] = "ExecUnmount", +@@ -2249,6 +2240,4 @@ const UnitVTable mount_vtable = { + [JOB_TIMEOUT] = "Timed out unmounting %s.", + }, + }, +- +- .test_start_limit = mount_test_start_limit, + }; +diff --git a/src/core/path.c b/src/core/path.c +index 2b659696a4..e098e83a31 100644 +--- a/src/core/path.c ++++ b/src/core/path.c +@@ -590,6 +590,12 @@ static int path_start(Unit *u) { + if (r < 0) + return r; + ++ r = unit_test_start_limit(u); ++ if (r < 0) { ++ path_enter_dead(p, PATH_FAILURE_START_LIMIT_HIT); ++ return r; ++ } ++ + r = unit_acquire_invocation_id(u); + if (r < 0) + return r; +@@ -805,21 +811,6 @@ static void path_reset_failed(Unit *u) { + p->result = PATH_SUCCESS; + } + +-static int path_test_start_limit(Unit *u) { +- Path *p = PATH(u); +- int r; +- +- assert(p); +- +- r = unit_test_start_limit(u); +- if (r < 0) { +- path_enter_dead(p, PATH_FAILURE_START_LIMIT_HIT); +- return r; +- } +- +- return 0; +-} +- + static const char* const path_type_table[_PATH_TYPE_MAX] = { + [PATH_EXISTS] = "PathExists", + [PATH_EXISTS_GLOB] = "PathExistsGlob", +@@ -874,6 +865,4 @@ const UnitVTable path_vtable = { + .reset_failed = path_reset_failed, + + .bus_set_property = bus_path_set_property, +- +- .test_start_limit = path_test_start_limit, + }; +diff --git a/src/core/service.c b/src/core/service.c +index 701c145565..7b90822f68 100644 +--- a/src/core/service.c ++++ b/src/core/service.c +@@ -2456,6 +2456,13 @@ static int service_start(Unit *u) { + + assert(IN_SET(s->state, SERVICE_DEAD, SERVICE_FAILED)); + ++ /* Make sure we don't enter a busy loop of some kind. */ ++ r = unit_test_start_limit(u); ++ if (r < 0) { ++ service_enter_dead(s, SERVICE_FAILURE_START_LIMIT_HIT, false); ++ return r; ++ } ++ + r = unit_acquire_invocation_id(u); + if (r < 0) + return r; +@@ -4451,22 +4458,6 @@ static const char *service_finished_job(Unit *u, JobType t, JobResult result) { + return NULL; + } + +-static int service_test_start_limit(Unit *u) { +- Service *s = SERVICE(u); +- int r; +- +- assert(s); +- +- /* Make sure we don't enter a busy loop of some kind. */ +- r = unit_test_start_limit(u); +- if (r < 0) { +- service_enter_dead(s, SERVICE_FAILURE_START_LIMIT_HIT, false); +- return r; +- } +- +- return 0; +-} +- + static const char* const service_restart_table[_SERVICE_RESTART_MAX] = { + [SERVICE_RESTART_NO] = "no", + [SERVICE_RESTART_ON_SUCCESS] = "on-success", +@@ -4629,6 +4620,4 @@ const UnitVTable service_vtable = { + }, + .finished_job = service_finished_job, + }, +- +- .test_start_limit = service_test_start_limit, + }; +diff --git a/src/core/socket.c b/src/core/socket.c +index 31d88b71ff..f362a5baa8 100644 +--- a/src/core/socket.c ++++ b/src/core/socket.c +@@ -2515,6 +2515,12 @@ static int socket_start(Unit *u) { + + assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED)); + ++ r = unit_test_start_limit(u); ++ if (r < 0) { ++ socket_enter_dead(s, SOCKET_FAILURE_START_LIMIT_HIT); ++ return r; ++ } ++ + r = unit_acquire_invocation_id(u); + if (r < 0) + return r; +@@ -3423,21 +3429,6 @@ static int socket_can_clean(Unit *u, ExecCleanMask *ret) { + return exec_context_get_clean_mask(&s->exec_context, ret); + } + +-static int socket_test_start_limit(Unit *u) { +- Socket *s = SOCKET(u); +- int r; +- +- assert(s); +- +- r = unit_test_start_limit(u); +- if (r < 0) { +- socket_enter_dead(s, SOCKET_FAILURE_START_LIMIT_HIT); +- return r; +- } +- +- return 0; +-} +- + static const char* const socket_exec_command_table[_SOCKET_EXEC_COMMAND_MAX] = { + [SOCKET_EXEC_START_PRE] = "ExecStartPre", + [SOCKET_EXEC_START_CHOWN] = "ExecStartChown", +@@ -3564,6 +3555,4 @@ const UnitVTable socket_vtable = { + [JOB_TIMEOUT] = "Timed out stopping %s.", + }, + }, +- +- .test_start_limit = socket_test_start_limit, + }; +diff --git a/src/core/swap.c b/src/core/swap.c +index b25f68fb7d..3843b19500 100644 +--- a/src/core/swap.c ++++ b/src/core/swap.c +@@ -933,6 +933,12 @@ static int swap_start(Unit *u) { + if (UNIT(other)->job && UNIT(other)->job->state == JOB_RUNNING) + return -EAGAIN; + ++ r = unit_test_start_limit(u); ++ if (r < 0) { ++ swap_enter_dead(s, SWAP_FAILURE_START_LIMIT_HIT); ++ return r; ++ } ++ + r = unit_acquire_invocation_id(u); + if (r < 0) + return r; +@@ -1582,21 +1588,6 @@ static int swap_can_clean(Unit *u, ExecCleanMask *ret) { + return exec_context_get_clean_mask(&s->exec_context, ret); + } + +-static int swap_test_start_limit(Unit *u) { +- Swap *s = SWAP(u); +- int r; +- +- assert(s); +- +- r = unit_test_start_limit(u); +- if (r < 0) { +- swap_enter_dead(s, SWAP_FAILURE_START_LIMIT_HIT); +- return r; +- } +- +- return 0; +-} +- + static const char* const swap_exec_command_table[_SWAP_EXEC_COMMAND_MAX] = { + [SWAP_EXEC_ACTIVATE] = "ExecActivate", + [SWAP_EXEC_DEACTIVATE] = "ExecDeactivate", +@@ -1692,6 +1683,4 @@ const UnitVTable swap_vtable = { + [JOB_TIMEOUT] = "Timed out deactivating swap %s.", + }, + }, +- +- .test_start_limit = swap_test_start_limit, + }; +diff --git a/src/core/timer.c b/src/core/timer.c +index 5ecc9f35cf..e064ad9a2d 100644 +--- a/src/core/timer.c ++++ b/src/core/timer.c +@@ -635,6 +635,12 @@ static int timer_start(Unit *u) { + if (r < 0) + return r; + ++ r = unit_test_start_limit(u); ++ if (r < 0) { ++ timer_enter_dead(t, TIMER_FAILURE_START_LIMIT_HIT); ++ return r; ++ } ++ + r = unit_acquire_invocation_id(u); + if (r < 0) + return r; +@@ -895,21 +901,6 @@ static int timer_can_clean(Unit *u, ExecCleanMask *ret) { + return 0; + } + +-static int timer_test_start_limit(Unit *u) { +- Timer *t = TIMER(u); +- int r; +- +- assert(t); +- +- r = unit_test_start_limit(u); +- if (r < 0) { +- timer_enter_dead(t, TIMER_FAILURE_START_LIMIT_HIT); +- return r; +- } +- +- return 0; +-} +- + static const char* const timer_base_table[_TIMER_BASE_MAX] = { + [TIMER_ACTIVE] = "OnActiveSec", + [TIMER_BOOT] = "OnBootSec", +@@ -969,6 +960,4 @@ const UnitVTable timer_vtable = { + .timezone_change = timer_timezone_change, + + .bus_set_property = bus_timer_set_property, +- +- .test_start_limit = timer_test_start_limit, + }; +diff --git a/src/core/unit.c b/src/core/unit.c +index 69ed43578e..38d3eb703f 100644 +--- a/src/core/unit.c ++++ b/src/core/unit.c +@@ -1851,13 +1851,6 @@ int unit_start(Unit *u) { + + assert(u); + +- /* Check start rate limiting early so that failure conditions don't cause us to enter a busy loop. */ +- if (UNIT_VTABLE(u)->test_start_limit) { +- int r = UNIT_VTABLE(u)->test_start_limit(u); +- if (r < 0) +- return r; +- } +- + /* If this is already started, then this will succeed. Note that this will even succeed if this unit + * is not startable by the user. This is relied on to detect when we need to wait for units and when + * waiting is finished. */ +diff --git a/src/core/unit.h b/src/core/unit.h +index 9babd07188..759104ffa7 100644 +--- a/src/core/unit.h ++++ b/src/core/unit.h +@@ -649,10 +649,6 @@ typedef struct UnitVTable { + * of this type will immediately fail. */ + bool (*supported)(void); + +- /* If this function is set, it's invoked first as part of starting a unit to allow start rate +- * limiting checks to occur before we do anything else. */ +- int (*test_start_limit)(Unit *u); +- + /* The strings to print in status messages */ + UnitStatusMessageFormats status_message_formats; + +diff --git a/test/TEST-63-ISSUE-17433/Makefile b/test/TEST-63-ISSUE-17433/Makefile +deleted file mode 120000 +index e9f93b1104..0000000000 +--- a/test/TEST-63-ISSUE-17433/Makefile ++++ /dev/null +@@ -1 +0,0 @@ +-../TEST-01-BASIC/Makefile +\ No newline at end of file +diff --git a/test/TEST-63-ISSUE-17433/test.sh b/test/TEST-63-ISSUE-17433/test.sh +deleted file mode 100755 +index c595a9f2de..0000000000 +--- a/test/TEST-63-ISSUE-17433/test.sh ++++ /dev/null +@@ -1,9 +0,0 @@ +-#!/usr/bin/env bash +-set -e +- +-TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/17433" +- +-# shellcheck source=test/test-functions +-. "${TEST_BASE_DIR:?}/test-functions" +- +-do_test "$@" +diff --git a/test/meson.build b/test/meson.build +index 6f8f257c2d..47c7f4d49a 100644 +--- a/test/meson.build ++++ b/test/meson.build +@@ -33,8 +33,6 @@ if install_tests + install_dir : testdata_dir) + install_subdir('testsuite-52.units', + install_dir : testdata_dir) +- install_subdir('testsuite-63.units', +- install_dir : testdata_dir) + + testsuite08_dir = testdata_dir + '/testsuite-08.units' + install_data('testsuite-08.units/-.mount', +diff --git a/test/testsuite-10.units/test10.service b/test/testsuite-10.units/test10.service +index 2fb476b986..d0be786b01 100644 +--- a/test/testsuite-10.units/test10.service ++++ b/test/testsuite-10.units/test10.service +@@ -1,9 +1,6 @@ + [Unit] + Requires=test10.socket + ConditionPathExistsGlob=/tmp/nonexistent +-# Make sure we hit the socket trigger limit in the test and not the service start limit. +-StartLimitInterval=1000 +-StartLimitBurst=1000 + + [Service] + ExecStart=true +diff --git a/test/testsuite-63.units/test63.path b/test/testsuite-63.units/test63.path +deleted file mode 100644 +index a6573bda0a..0000000000 +--- a/test/testsuite-63.units/test63.path ++++ /dev/null +@@ -1,2 +0,0 @@ +-[Path] +-PathExists=/tmp/test63 +diff --git a/test/testsuite-63.units/test63.service b/test/testsuite-63.units/test63.service +deleted file mode 100644 +index c83801874d..0000000000 +--- a/test/testsuite-63.units/test63.service ++++ /dev/null +@@ -1,5 +0,0 @@ +-[Unit] +-ConditionPathExists=!/tmp/nonexistent +- +-[Service] +-ExecStart=true +diff --git a/test/units/testsuite-63.service b/test/units/testsuite-63.service +deleted file mode 100644 +index 04122723d4..0000000000 +--- a/test/units/testsuite-63.service ++++ /dev/null +@@ -1,16 +0,0 @@ +-[Unit] +-Description=TEST-63-ISSUE-17433 +- +-[Service] +-ExecStartPre=rm -f /failed /testok +-Type=oneshot +-ExecStart=rm -f /tmp/nonexistent +-ExecStart=systemctl start test63.path +-ExecStart=touch /tmp/test63 +-# Make sure systemd has sufficient time to hit the start limit for test63.service. +-ExecStart=sleep 2 +-ExecStart=sh -x -c 'test "$(systemctl show test63.service -P ActiveState)" = failed' +-ExecStart=sh -x -c 'test "$(systemctl show test63.service -P Result)" = start-limit-hit' +-ExecStart=sh -x -c 'test "$(systemctl show test63.path -P ActiveState)" = failed' +-ExecStart=sh -x -c 'test "$(systemctl show test63.path -P Result)" = unit-start-limit-hit' +-ExecStart=sh -x -c 'echo OK >/testok' +-- +2.31.1 + diff --git a/systemd.changes b/systemd.changes index 38dadab7..307f8f06 100644 --- a/systemd.changes +++ b/systemd.changes @@ -1,3 +1,14 @@ +------------------------------------------------------------------- +Tue Nov 2 10:26:58 UTC 2021 - Franck Bui + +- Add 0001-Revert-core-Check-unit-start-rate-limiting-earlier.patch + + Temporarly revert commit ed8fbbf1745c6a2dc0b8cd560ac8a3353f72e979 + until the regression it introduced [1] is addressed by upstream and + a fix is released via the stable tree. + + [1] https://github.com/systemd/systemd/issues/21025 + ------------------------------------------------------------------- Tue Oct 19 14:41:37 UTC 2021 - Franck Bui diff --git a/systemd.spec b/systemd.spec index 42e912d5..1be7837f 100644 --- a/systemd.spec +++ b/systemd.spec @@ -209,6 +209,7 @@ Patch12: 0012-resolved-create-etc-resolv.conf-symlink-at-runtime.patch # upstream and need an urgent fix. Even in this case, the patches are # temporary and should be removed as soon as a fix is merged by # upstream. +Patch100: 0001-Revert-core-Check-unit-start-rate-limiting-earlier.patch %description Systemd is a system and service manager, compatible with SysV and LSB