]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
pid1: add env var to override default mount rate limit burst 25638/head
authorLuca Boccassi <bluca@debian.org>
Mon, 5 Dec 2022 21:05:54 +0000 (21:05 +0000)
committerLuca Boccassi <bluca@debian.org>
Mon, 5 Dec 2022 21:05:57 +0000 (21:05 +0000)
I am hitting the rate limit on a busy system with low resources, and
it stalls the boot process which is Very Bad (TM).

docs/ENVIRONMENT.md
src/core/mount.c

index 01ee0655833061b58ac18767f0399992734ea9aa..604d1a6232ab2d576ba7da7fcd5523d6a32edcd2 100644 (file)
@@ -283,6 +283,13 @@ All tools:
   type as unsupported may not prevent loading some units of that type if they
   are referenced by other units of another supported type.
 
+* `$SYSTEMD_DEFAULT_MOUNT_RATE_LIMIT_BURST` — can be set to override the mount
+  units burst rate limit for parsing `/proc/self/mountinfo`. On a system with
+  few resources but many mounts the rate limit may be hit, which will cause the
+  processing of mount units to stall. The burst limit may be adjusted when the
+  default is not appropriate for a given system. Defaults to `5`, accepts
+  positive integers.
+
 `systemd-remount-fs`:
 
 * `$SYSTEMD_REMOUNT_ROOT_RW=1` — if set and no entry for the root directory
index be46e566896e8c2923e543a05bb23a7cb2f7587c..f16e5c487bcbbc6a816ea66e952761734068ee41 100644 (file)
@@ -1909,6 +1909,7 @@ static void mount_enumerate(Manager *m) {
         mnt_init_debug(0);
 
         if (!m->mount_monitor) {
+                unsigned mount_rate_limit_burst = 5;
                 int fd;
 
                 m->mount_monitor = mnt_new_monitor();
@@ -1948,7 +1949,15 @@ static void mount_enumerate(Manager *m) {
                         goto fail;
                 }
 
-                r = sd_event_source_set_ratelimit(m->mount_event_source, 1 * USEC_PER_SEC, 5);
+                /* Let users override the default (5 in 1s), as it stalls the boot sequence on busy systems. */
+                const char *e = secure_getenv("SYSTEMD_DEFAULT_MOUNT_RATE_LIMIT_BURST");
+                if (e) {
+                        r = safe_atou(e, &mount_rate_limit_burst);
+                        if (r < 0)
+                                log_debug("Invalid value in $SYSTEMD_DEFAULT_MOUNT_RATE_LIMIT_BURST, ignoring: %s", e);
+                }
+
+                r = sd_event_source_set_ratelimit(m->mount_event_source, 1 * USEC_PER_SEC, mount_rate_limit_burst);
                 if (r < 0) {
                         log_error_errno(r, "Failed to enable rate limit for mount events: %m");
                         goto fail;