summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-10-13 11:17:33 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-10-13 11:17:33 +0200
commitf0bce95d03cfdc3b190aef80029eccc36261616e (patch)
tree6cda344ad802f5317091d90cbef08ff901fab03b
parent37744236bda9993aa3db329356b182c6ffc9d178 (diff)
downloadsystemd-f0bce95d03cfdc3b190aef80029eccc36261616e.tar.gz
Revert "core: Check unit start rate limiting earlier"
This reverts commit 1f77dbfaaedcb8bdecc6610fa96f7fed80bfb8d8. This was causing problems during boot, see https://bodhi.fedoraproject.org/updates/FEDORA-2021-a1a52487e6, https://bugzilla.redhat.com/show_bug.cgi?id=2013386.
-rw-r--r--src/core/automount.c23
-rw-r--r--src/core/mount.c23
-rw-r--r--src/core/path.c23
-rw-r--r--src/core/service.c25
-rw-r--r--src/core/socket.c23
-rw-r--r--src/core/swap.c23
-rw-r--r--src/core/timer.c23
-rw-r--r--src/core/unit.c7
-rw-r--r--src/core/unit.h4
l---------test/TEST-63-ISSUE-17433/Makefile1
-rwxr-xr-xtest/TEST-63-ISSUE-17433/test.sh9
-rw-r--r--test/meson.build2
-rw-r--r--test/testsuite-10.units/test10.service3
-rw-r--r--test/testsuite-63.units/test63.path2
-rw-r--r--test/testsuite-63.units/test63.service5
-rw-r--r--test/units/testsuite-63.service16
16 files changed, 43 insertions, 169 deletions
diff --git a/src/core/automount.c b/src/core/automount.c
index 907497bdaa..fa7f64b71a 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 fd8dfd91b1..8589adbca8 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -1145,6 +1145,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;
@@ -2114,21 +2120,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",
@@ -2226,6 +2217,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 9c3b09ec03..c055fcb3d2 100644
--- a/src/core/path.c
+++ b/src/core/path.c
@@ -566,6 +566,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;
@@ -781,21 +787,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",
@@ -850,6 +841,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 3e1c0ddb5b..9952aaa4c8 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -2457,6 +2457,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;
@@ -4457,22 +4464,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",
@@ -4639,6 +4630,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 5c2298ee58..47092e1571 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -2517,6 +2517,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;
@@ -3425,21 +3431,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",
@@ -3570,6 +3561,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 3cd959d22f..9edb929555 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -938,6 +938,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;
@@ -1587,21 +1593,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",
@@ -1697,6 +1688,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 19573ef032..b063768815 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 f841c6dc81..780f78e1c5 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -1613,13 +1613,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 212a78e99d..a34d260943 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -618,10 +618,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 ff43d5e4e4..180e6bb3f7 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'