1
0
mirror of https://github.com/systemd/systemd synced 2024-07-08 20:15:55 +00:00

core: split system/user job timeouts and make them configurable

Config options are -Ddefault-timeout-sec= and -Ddefault-user-timeout-sec=.
Existing -Dupdate-helper-user-timeout= is renamed to -Dupdate-helper-user-timeout-sec=
for consistency. All three options take an integer value in seconds. The
renaming and type-change of the option is a small compat break, but it's just
at compile time and result in a clear error message. I also doubt that anyone was
actually using the option.

This commit separates the user manager timeouts, but keeps them unchanged at 90 s.
The timeout for the user manager is set to 4/3*user-timeout, which means that it
is still 120 s.

Fedora wants to experiment with lower timeouts, but doing this via a patch would
be annoying and more work than necessary. Let's make this easy to configure.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2021-01-26 20:23:12 +01:00 committed by Luca Boccassi
parent 15796f28ea
commit e4c7b5f517
13 changed files with 62 additions and 46 deletions

View File

@ -15,5 +15,7 @@
<!ENTITY HIGH_RLIMIT_NOFILE "{{HIGH_RLIMIT_NOFILE}}">
<!ENTITY DEFAULT_DNSSEC_MODE "{{DEFAULT_DNSSEC_MODE_STR}}">
<!ENTITY DEFAULT_DNS_OVER_TLS_MODE "{{DEFAULT_DNS_OVER_TLS_MODE_STR}}">
<!ENTITY DEFAULT_TIMEOUT "{{DEFAULT_TIMEOUT_SEC}} s">
<!ENTITY DEFAULT_USER_TIMEOUT "{{DEFAULT_USER_TIMEOUT_SEC}} s">
<!ENTITY fedora_latest_version "36">
<!ENTITY fedora_cloud_release "1.5">

View File

@ -349,25 +349,20 @@
<term><varname>DefaultTimeoutAbortSec=</varname></term>
<term><varname>DefaultRestartSec=</varname></term>
<listitem><para>Configures the default timeouts for starting,
stopping and aborting of units, as well as the default time to sleep
between automatic restarts of units, as configured per-unit in
<varname>TimeoutStartSec=</varname>,
<varname>TimeoutStopSec=</varname>,
<varname>TimeoutAbortSec=</varname> and
<varname>RestartSec=</varname> (for services, see
<listitem><para>Configures the default timeouts for starting, stopping and aborting of units, as well
as the default time to sleep between automatic restarts of units, as configured per-unit in
<varname>TimeoutStartSec=</varname>, <varname>TimeoutStopSec=</varname>,
<varname>TimeoutAbortSec=</varname> and <varname>RestartSec=</varname> (for services, see
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
for details on the per-unit settings). Disabled by default, when
service with <varname>Type=oneshot</varname> is used.
For non-service units,
<varname>DefaultTimeoutStartSec=</varname> sets the default
<varname>TimeoutSec=</varname>
value. <varname>DefaultTimeoutStartSec=</varname> and
<varname>DefaultTimeoutStopSec=</varname> default to
90s. <varname>DefaultTimeoutAbortSec=</varname> is not set by default
so that all units fall back to <varname>TimeoutStopSec=</varname>.
<varname>DefaultRestartSec=</varname> defaults to
100ms.</para></listitem>
for details on the per-unit settings). For non-service units,
<varname>DefaultTimeoutStartSec=</varname> sets the default <varname>TimeoutSec=</varname> value.
</para>
<para><varname>DefaultTimeoutStartSec=</varname> and <varname>DefaultTimeoutStopSec=</varname>
default to &DEFAULT_TIMEOUT; in the system manager and &DEFAULT_USER_TIMEOUT; in the user manager.
<varname>DefaultTimeoutAbortSec=</varname> is not set by default so that all units fall back to
<varname>TimeoutStopSec=</varname>. <varname>DefaultRestartSec=</varname> defaults to 100 ms.
</para></listitem>
</varlistentry>
<varlistentry>
@ -378,7 +373,8 @@
and <filename>/etc/crypttab</filename> (see
<citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
<citerefentry><refentrytitle>crypttab</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
Defaults to 90s.</para></listitem>
Defaults to &DEFAULT_TIMEOUT; in the system manager and &DEFAULT_USER_TIMEOUT; in the user manager.
</para></listitem>
</varlistentry>
<varlistentry>

View File

@ -612,11 +612,12 @@
<varlistentry>
<term><varname>TimeoutStartSec=</varname></term>
<listitem><para>Configures the time to wait for start-up. If a daemon service does not signal start-up
completion within the configured time, the service will be considered failed and will be shut down again. The
precise action depends on the <varname>TimeoutStartFailureMode=</varname> option. Takes a unit-less value in
seconds, or a time span value such as "5min 20s". Pass <literal>infinity</literal> to disable the timeout logic.
Defaults to <varname>DefaultTimeoutStartSec=</varname> from the manager configuration file, except when
<listitem><para>Configures the time to wait for start-up. If a daemon service does not signal
start-up completion within the configured time, the service will be considered failed and will be
shut down again. The precise action depends on the <varname>TimeoutStartFailureMode=</varname>
option. Takes a unit-less value in seconds, or a time span value such as "5min 20s". Pass
<literal>infinity</literal> to disable the timeout logic. Defaults to
<varname>DefaultTimeoutStartSec=</varname> set in the manager, except when
<varname>Type=oneshot</varname> is used, in which case the timeout is disabled by default (see
<citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
</para>

View File

@ -294,7 +294,6 @@ conf.set_quoted('USER_TMPFILES_DIR', usertmpfilesdir)
conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
conf.set_quoted('UDEV_HWDB_DIR', udevhwdbdir)
conf.set_quoted('UDEV_RULES_DIR', udevrulesdir)
conf.set_quoted('UPDATE_HELPER_USER_TIMEOUT', get_option('update-helper-user-timeout'))
conf.set_quoted('USER_CONFIG_UNIT_DIR', pkgsysconfdir / 'user')
conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
@ -310,6 +309,10 @@ conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_
conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
conf.set_quoted('STATUS_UNIT_FORMAT_DEFAULT_STR', status_unit_format_default)
conf.set('DEFAULT_TIMEOUT_SEC', get_option('default-timeout-sec'))
conf.set('DEFAULT_USER_TIMEOUT_SEC', get_option('default-user-timeout-sec'))
conf.set('UPDATE_HELPER_USER_TIMEOUT_SEC', get_option('update-helper-user-timeout-sec'))
conf.set10('FIRST_BOOT_FULL_PRESET', get_option('first-boot-full-preset'))
#####################################################################

View File

@ -187,6 +187,10 @@ option('dbussystemservicedir', type : 'string',
description : 'D-Bus system service directory')
option('dbus-interfaces-dir', type : 'string',
description : 'export D-Bus introspection XML as standalone files')
option('default-timeout-sec', type : 'integer', value : 90,
description : 'default timeout for system unit start/stop')
option('default-user-timeout-sec', type : 'integer', value : 90,
description : 'default timeout for user unit start/stop')
option('pkgconfigdatadir', type : 'string', value : '',
description : 'directory for arch-independent pkg-config files')
option('pkgconfiglibdir', type : 'string', value : '',
@ -195,8 +199,8 @@ option('xinitrcdir', type : 'string', value : '',
description : 'directory for xinitrc files')
option('rpmmacrosdir', type : 'string', value : 'lib/rpm/macros.d',
description : 'directory for rpm macros ["no" disables]')
option('update-helper-user-timeout', type : 'string', value : '15s',
description : 'how long to wait for user manager operations')
option('update-helper-user-timeout-sec', type : 'integer', value : 15,
description : 'timeout for user manager package operations')
option('pamlibdir', type : 'string',
description : 'directory for PAM modules')
option('pamconfdir', type : 'string',

View File

@ -25,8 +25,13 @@
# endif
#endif
#define DEFAULT_TIMEOUT_USEC (90*USEC_PER_SEC)
#define DEFAULT_RESTART_USEC (100*USEC_PER_MSEC)
/* Many different things, but also system unit start/stop */
#define DEFAULT_TIMEOUT_USEC (DEFAULT_TIMEOUT_SEC*USEC_PER_SEC)
/* User unit start/stop */
#define DEFAULT_USER_TIMEOUT_USEC (DEFAULT_USER_TIMEOUT_SEC*USEC_PER_SEC)
/* Timeout for user confirmation on the console */
#define DEFAULT_CONFIRM_USEC (30*USEC_PER_SEC)
/* We use an extra-long timeout for the reload. This is because a reload or reexec means generators are rerun

View File

@ -2436,11 +2436,11 @@ static void reset_arguments(void) {
arg_default_std_output = EXEC_OUTPUT_JOURNAL;
arg_default_std_error = EXEC_OUTPUT_INHERIT;
arg_default_restart_usec = DEFAULT_RESTART_USEC;
arg_default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
arg_default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
arg_default_timeout_abort_usec = DEFAULT_TIMEOUT_USEC;
arg_default_timeout_start_usec = manager_default_timeout(arg_system);
arg_default_timeout_stop_usec = manager_default_timeout(arg_system);
arg_default_timeout_abort_usec = manager_default_timeout(arg_system);
arg_default_timeout_abort_set = false;
arg_default_device_timeout_usec = DEFAULT_TIMEOUT_USEC;
arg_default_device_timeout_usec = manager_default_timeout(arg_system);
arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
arg_runtime_watchdog = 0;

View File

@ -835,10 +835,10 @@ int manager_new(LookupScope scope, ManagerTestRunFlags test_run_flags, Manager *
.default_memory_accounting = MEMORY_ACCOUNTING_DEFAULT,
.default_tasks_accounting = true,
.default_tasks_max = TASKS_MAX_UNSET,
.default_timeout_start_usec = DEFAULT_TIMEOUT_USEC,
.default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC,
.default_timeout_start_usec = manager_default_timeout(scope == LOOKUP_SCOPE_SYSTEM),
.default_timeout_stop_usec = manager_default_timeout(scope == LOOKUP_SCOPE_SYSTEM),
.default_restart_usec = DEFAULT_RESTART_USEC,
.default_device_timeout_usec = DEFAULT_TIMEOUT_USEC,
.default_device_timeout_usec = manager_default_timeout(scope == LOOKUP_SCOPE_SYSTEM),
.original_log_level = -1,
.original_log_target = _LOG_TARGET_INVALID,

View File

@ -485,6 +485,10 @@ static inline usec_t manager_default_timeout_abort_usec(Manager *m) {
#define MANAGER_IS_TEST_RUN(m) ((m)->test_run_flags != 0)
static inline usec_t manager_default_timeout(bool is_system) {
return is_system ? DEFAULT_TIMEOUT_USEC : DEFAULT_USER_TIMEOUT_USEC;
}
int manager_new(LookupScope scope, ManagerTestRunFlags test_run_flags, Manager **m);
Manager* manager_free(Manager *m);
DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);

View File

@ -43,10 +43,10 @@
#DefaultTimerAccuracySec=1min
#DefaultStandardOutput=journal
#DefaultStandardError=inherit
#DefaultTimeoutStartSec=90s
#DefaultTimeoutStopSec=90s
#DefaultTimeoutStartSec={{DEFAULT_TIMEOUT_SEC}}s
#DefaultTimeoutStopSec={{DEFAULT_TIMEOUT_SEC}}s
#DefaultTimeoutAbortSec=
#DefaultDeviceTimeoutSec=90s
#DefaultDeviceTimeoutSec={{DEFAULT_TIMEOUT_SEC}}s
#DefaultRestartSec=100ms
#DefaultStartLimitIntervalSec=10s
#DefaultStartLimitBurst=5

View File

@ -24,9 +24,10 @@
#DefaultTimerAccuracySec=1min
#DefaultStandardOutput=inherit
#DefaultStandardError=inherit
#DefaultTimeoutStartSec=90s
#DefaultTimeoutStopSec=90s
#DefaultTimeoutStartSec={{DEFAULT_USER_TIMEOUT_SEC}}s
#DefaultTimeoutStopSec={{DEFAULT_USER_TIMEOUT_SEC}}s
#DefaultTimeoutAbortSec=
#DefaultDeviceTimeoutSec={{DEFAULT_USER_TIMEOUT_SEC}}s
#DefaultRestartSec=100ms
#DefaultStartLimitIntervalSec=10s
#DefaultStartLimitBurst=5

View File

@ -32,7 +32,7 @@ case "$command" in
users=$(systemctl list-units 'user@*' --legend=no | sed -n -r 's/.*user@([0-9]+).service.*/\1/p')
for user in $users; do
SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT}} \
SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT_SEC}}s \
systemctl --user -M "$user@" disable --now --no-warn "$@" &
done
wait
@ -53,7 +53,7 @@ case "$command" in
users=$(systemctl list-units 'user@*' --legend=no | sed -n -r 's/.*user@([0-9]+).service.*/\1/p')
for user in $users; do
for unit in "$@"; do
SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT}} \
SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT_SEC}}s \
systemctl --user -M "$user@" set-property "$unit" Markers=+needs-restart &
done
done
@ -89,7 +89,7 @@ case "$command" in
if [[ "$command" =~ reexec ]]; then
for user in $users; do
SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT}} \
SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT_SEC}}s \
systemctl --user -M "$user@" daemon-reexec &
done
wait
@ -97,7 +97,7 @@ case "$command" in
if [[ "$command" =~ reload ]]; then
for user in $users; do
SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT}} \
SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT_SEC}}s \
systemctl --user -M "$user@" daemon-reload &
done
wait
@ -105,7 +105,7 @@ case "$command" in
if [[ "$command" =~ restart ]]; then
for user in $users; do
SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT}} \
SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT_SEC}}s \
systemctl --user -M "$user@" reload-or-restart --marked &
done
wait

View File

@ -23,6 +23,6 @@ Slice=user-%i.slice
KillMode=mixed
Delegate=pids memory cpu
TasksMax=infinity
TimeoutStopSec=120s
TimeoutStopSec={{ DEFAULT_USER_TIMEOUT_SEC*4//3 }}s
KeyringMode=inherit
OOMScoreAdjust=100