summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/systemd.service.xml10
-rw-r--r--src/core/service.c2
-rw-r--r--src/shared/ratelimit.h7
3 files changed, 18 insertions, 1 deletions
diff --git a/man/systemd.service.xml b/man/systemd.service.xml
index 60155e68cb..fcd3a7dd38 100644
--- a/man/systemd.service.xml
+++ b/man/systemd.service.xml
@@ -768,7 +768,15 @@
however they may still be restarted
manually at a later point from which
point on the restart logic is again
- activated.</para></listitem>
+ activated. Note that
+ <command>systemctl
+ reset-failed</command> will cause the
+ restart rate counter for a service to
+ be flushed, which is useful if the
+ administrator wants to manually start
+ a service and the start limit
+ interferes with
+ that.</para></listitem>
</varlistentry>
<varlistentry>
diff --git a/src/core/service.c b/src/core/service.c
index d82803db2b..0c29d4aefa 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -3655,6 +3655,8 @@ static void service_reset_failed(Unit *u) {
s->result = SERVICE_SUCCESS;
s->reload_result = SERVICE_SUCCESS;
+
+ RATELIMIT_RESET(s->start_limit);
}
static int service_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError *error) {
diff --git a/src/shared/ratelimit.h b/src/shared/ratelimit.h
index 07e8205c81..ad00267a6e 100644
--- a/src/shared/ratelimit.h
+++ b/src/shared/ratelimit.h
@@ -48,6 +48,13 @@ typedef struct RateLimit {
_r->begin = 0; \
} while (false)
+#define RATELIMIT_RESET(v) \
+ do { \
+ RateLimit *_r = &(v); \
+ _r->num = 0; \
+ _r->begin = 0; \
+ } while (false)
+
bool ratelimit_test(RateLimit *r);
#endif