timer: order OnCalendar units after timer-sync.target if DefaultDependencies=no

Avoids triggering timers prematurely on systems with significantly inaccurate
clocks, or some embedded platforms that lack one entirely.
This commit is contained in:
Tobias Geerinckx-Rice 2014-08-04 22:15:52 +02:00 committed by Lennart Poettering
parent eb7040ec50
commit 19f8d03783
4 changed files with 22 additions and 9 deletions

2
TODO
View File

@ -71,8 +71,6 @@ Features:
* Add a new verb "systemctl top" * Add a new verb "systemctl top"
* order OnCalendar timer units after timer-sync.target if DefaultDependencies=no so that we don't trigger them prematurely
* refuse mounting on symlinks * refuse mounting on symlinks
* logind: allow users to kill or lock their own sessions * logind: allow users to kill or lock their own sessions

View File

@ -78,15 +78,20 @@
<varname>Unit=</varname> (see below).</para> <varname>Unit=</varname> (see below).</para>
<para>Unless <varname>DefaultDependencies=</varname> <para>Unless <varname>DefaultDependencies=</varname>
is set to <option>false</option>, timer units will is set to <option>false</option>, all timer units will
implicitly have dependencies of type implicitly have dependencies of type
<varname>Conflicts=</varname> and <varname>Conflicts=</varname> and
<varname>Before=</varname> on <varname>Before=</varname> on
<filename>shutdown.target</filename>. These ensure <filename>shutdown.target</filename> to ensure that
that timer units are stopped cleanly prior to system they are stopped cleanly prior to system shutdown.
shutdown. Only timer units involved with early boot or Timer units with at least one
late system shutdown should disable this <varname>OnCalendar=</varname> directive will have an
option.</para> additional <varname>After=</varname> dependency on
<filename>timer-sync.target</filename> to avoid
being started before the system clock has been
correctly set. Only timer units involved with early
boot or late system shutdown should disable the
<varname>DefaultDependencies=</varname> option.</para>
</refsect1> </refsect1>
<refsect1> <refsect1>

View File

@ -95,6 +95,7 @@ static int timer_verify(Timer *t) {
static int timer_add_default_dependencies(Timer *t) { static int timer_add_default_dependencies(Timer *t) {
int r; int r;
TimerValue *v;
assert(t); assert(t);
@ -106,6 +107,15 @@ static int timer_add_default_dependencies(Timer *t) {
r = unit_add_two_dependencies_by_name(UNIT(t), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, NULL, true); r = unit_add_two_dependencies_by_name(UNIT(t), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SYSINIT_TARGET, NULL, true);
if (r < 0) if (r < 0)
return r; return r;
LIST_FOREACH(value, v, t->values) {
if (v->base == TIMER_CALENDAR) {
r = unit_add_dependency_by_name(UNIT(t), UNIT_AFTER, SPECIAL_TIME_SYNC_TARGET, NULL, true);
if (r < 0)
return r;
break;
}
}
} }
return unit_add_two_dependencies_by_name(UNIT(t), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true); return unit_add_two_dependencies_by_name(UNIT(t), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);

View File

@ -57,13 +57,13 @@
#define SPECIAL_REMOTE_FS_PRE_TARGET "remote-fs-pre.target" #define SPECIAL_REMOTE_FS_PRE_TARGET "remote-fs-pre.target"
#define SPECIAL_SWAP_TARGET "swap.target" #define SPECIAL_SWAP_TARGET "swap.target"
#define SPECIAL_NETWORK_ONLINE_TARGET "network-online.target" #define SPECIAL_NETWORK_ONLINE_TARGET "network-online.target"
#define SPECIAL_TIME_SYNC_TARGET "time-sync.target" /* LSB's $time */
#define SPECIAL_BASIC_TARGET "basic.target" #define SPECIAL_BASIC_TARGET "basic.target"
/* LSB compatibility */ /* LSB compatibility */
#define SPECIAL_NETWORK_TARGET "network.target" /* LSB's $network */ #define SPECIAL_NETWORK_TARGET "network.target" /* LSB's $network */
#define SPECIAL_NSS_LOOKUP_TARGET "nss-lookup.target" /* LSB's $named */ #define SPECIAL_NSS_LOOKUP_TARGET "nss-lookup.target" /* LSB's $named */
#define SPECIAL_RPCBIND_TARGET "rpcbind.target" /* LSB's $portmap */ #define SPECIAL_RPCBIND_TARGET "rpcbind.target" /* LSB's $portmap */
#define SPECIAL_TIME_SYNC_TARGET "time-sync.target" /* LSB's $time */
/* /*
* Rules regarding adding further high level targets like the above: * Rules regarding adding further high level targets like the above: