core: Delay start rate limit check when starting a unit

Doing start rate limit checks before doing condition checks made
condition check failures count towards the start rate limit which
broke existing assumptions (see #21025). Run the rate limit checks
after the condition checks again to restore the previous behaviour.
This commit is contained in:
Daan De Meyer 2021-10-19 10:45:48 +01:00
parent 5f37c1a955
commit ce2146f525

View File

@ -1855,13 +1855,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) {
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. */
@ -1911,6 +1904,13 @@ int unit_start(Unit *u) {
return unit_start(following);
}
/* 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) {
r = UNIT_VTABLE(u)->test_start_limit(u);
if (r < 0)
return r;
}
/* If it is stopped, but we cannot start it, then fail */
if (!UNIT_VTABLE(u)->start)
return -EBADR;