From: Daan De Meyer Date: Tue, 19 Oct 2021 09:45:48 +0000 (+0100) Subject: core: Delay start rate limit check when starting a unit X-Git-Tag: v250-rc1~360^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ce2146f5256659c7fb53a7d5b9dc551252e27e7e;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/core/unit.c b/src/core/unit.c index a2944c19176..a6403002a6f 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -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;