diff options
-rw-r--r-- | man/systemd.unit.xml | 16 | ||||
-rw-r--r-- | src/dbus-unit.h | 6 | ||||
-rw-r--r-- | src/load-fragment-gperf.gperf.m4 | 2 | ||||
-rw-r--r-- | src/manager.c | 18 | ||||
-rw-r--r-- | src/unit.c | 8 | ||||
-rw-r--r-- | src/unit.h | 4 |
6 files changed, 51 insertions, 3 deletions
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml index 897f99f24c..30559b99f8 100644 --- a/man/systemd.unit.xml +++ b/man/systemd.unit.xml @@ -510,6 +510,22 @@ </varlistentry> <varlistentry> + <term><varname>PropagateReloadTo=</varname></term> + <term><varname>PropagateReloadFrom=</varname></term> + + <listitem><para>Lists one or more + units where reload requests on the + unit will be propagated to/on the + other unit will be propagated + from. Issuing a reload request on a + unit will automatically also enqueue a + reload request on all units that the + reload request shall be propagated to + via these two + settings.</para></listitem> + </varlistentry> + + <varlistentry> <term><varname>OnFailureIsolate=</varname></term> <listitem><para>Takes a boolean diff --git a/src/dbus-unit.h b/src/dbus-unit.h index 20d5506870..7a434100b8 100644 --- a/src/dbus-unit.h +++ b/src/dbus-unit.h @@ -80,6 +80,10 @@ " <property name=\"Before\" type=\"as\" access=\"read\"/>\n" \ " <property name=\"After\" type=\"as\" access=\"read\"/>\n" \ " <property name=\"OnFailure\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"Triggers\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"TriggeredBy\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"PropagateReloadTo\" type=\"as\" access=\"read\"/>\n" \ + " <property name=\"PropagateReloadFrom\" type=\"as\" access=\"read\"/>\n" \ " <property name=\"Description\" type=\"s\" access=\"read\"/>\n" \ " <property name=\"LoadState\" type=\"s\" access=\"read\"/>\n" \ " <property name=\"ActiveState\" type=\"s\" access=\"read\"/>\n" \ @@ -143,6 +147,8 @@ { "org.freedesktop.systemd1.Unit", "OnFailure", bus_unit_append_dependencies, "as", u->meta.dependencies[UNIT_ON_FAILURE] }, \ { "org.freedesktop.systemd1.Unit", "Triggers", bus_unit_append_dependencies, "as", u->meta.dependencies[UNIT_TRIGGERS] }, \ { "org.freedesktop.systemd1.Unit", "TriggeredBy", bus_unit_append_dependencies, "as", u->meta.dependencies[UNIT_TRIGGERED_BY] }, \ + { "org.freedesktop.systemd1.Unit", "PropagateReloadTo", bus_unit_append_dependencies, "as", u->meta.dependencies[UNIT_PROPAGATE_RELOAD_TO] }, \ + { "org.freedesktop.systemd1.Unit", "PropagateReloadFrom", bus_unit_append_dependencies, "as", u->meta.dependencies[UNIT_PROPAGATE_RELOAD_FROM] }, \ { "org.freedesktop.systemd1.Unit", "Description", bus_unit_append_description, "s", u }, \ { "org.freedesktop.systemd1.Unit", "LoadState", bus_unit_append_load_state, "s", &u->meta.load_state }, \ { "org.freedesktop.systemd1.Unit", "ActiveState", bus_unit_append_active_state, "s", u }, \ diff --git a/src/load-fragment-gperf.gperf.m4 b/src/load-fragment-gperf.gperf.m4 index 81e186c256..11e6324596 100644 --- a/src/load-fragment-gperf.gperf.m4 +++ b/src/load-fragment-gperf.gperf.m4 @@ -100,6 +100,8 @@ Unit.Conflicts, config_parse_unit_deps, UNIT_CONFLI Unit.Before, config_parse_unit_deps, UNIT_BEFORE, 0 Unit.After, config_parse_unit_deps, UNIT_AFTER, 0 Unit.OnFailure, config_parse_unit_deps, UNIT_ON_FAILURE, 0 +Unit.PropagateReloadTo, config_parse_unit_deps, UNIT_PROPAGATE_RELOAD_TO, 0 +Unit.PropagateReloadFrom, config_parse_unit_deps, UNIT_PROPAGATE_RELOAD_FROM, 0 Unit.StopWhenUnneeded, config_parse_bool, 0, offsetof(Meta, stop_when_unneeded) Unit.RefuseManualStart, config_parse_bool, 0, offsetof(Meta, refuse_manual_start) Unit.RefuseManualStop, config_parse_bool, 0, offsetof(Meta, refuse_manual_stop) diff --git a/src/manager.c b/src/manager.c index 7fd860ed06..dbcd630b05 100644 --- a/src/manager.c +++ b/src/manager.c @@ -1610,7 +1610,9 @@ static int transaction_add_job_and_dependencies( dbus_error_free(e); } - } else if (type == JOB_STOP || type == JOB_RESTART || type == JOB_TRY_RESTART) { + } + + if (type == JOB_STOP || type == JOB_RESTART || type == JOB_TRY_RESTART) { SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_REQUIRED_BY], i) if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) { @@ -1633,6 +1635,20 @@ static int transaction_add_job_and_dependencies( } } + if (type == JOB_RELOAD || type == JOB_RELOAD_OR_START) { + + SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_PROPAGATE_RELOAD_TO], i) { + r = transaction_add_job_and_dependencies(m, JOB_RELOAD, dep, ret, false, override, false, false, ignore_order, e, NULL); + + if (r < 0) { + log_warning("Cannot add dependency reload job for unit %s, ignoring: %s", dep->meta.id, bus_error(e, r)); + + if (e) + dbus_error_free(e); + } + } + } + /* JOB_VERIFY_STARTED, JOB_RELOAD require no dependency handling */ } diff --git a/src/unit.c b/src/unit.c index 3b476a8e02..e07d2c15d2 100644 --- a/src/unit.c +++ b/src/unit.c @@ -1539,7 +1539,9 @@ int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_referen [UNIT_REFERENCES] = UNIT_REFERENCED_BY, [UNIT_REFERENCED_BY] = UNIT_REFERENCES, [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY, - [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS + [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS, + [UNIT_PROPAGATE_RELOAD_TO] = UNIT_PROPAGATE_RELOAD_FROM, + [UNIT_PROPAGATE_RELOAD_FROM] = UNIT_PROPAGATE_RELOAD_TO }; int r, q = 0, v = 0, w = 0; @@ -2663,7 +2665,9 @@ static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = { [UNIT_REFERENCED_BY] = "ReferencedBy", [UNIT_ON_FAILURE] = "OnFailure", [UNIT_TRIGGERS] = "Triggers", - [UNIT_TRIGGERED_BY] = "TriggeredBy" + [UNIT_TRIGGERED_BY] = "TriggeredBy", + [UNIT_PROPAGATE_RELOAD_TO] = "PropagateReloadTo", + [UNIT_PROPAGATE_RELOAD_FROM] = "PropagateReloadFrom" }; DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency); diff --git a/src/unit.h b/src/unit.h index 4d83309591..19314d6fbd 100644 --- a/src/unit.h +++ b/src/unit.h @@ -124,6 +124,10 @@ enum UnitDependency { UNIT_TRIGGERS, UNIT_TRIGGERED_BY, + /* Propagate reloads */ + UNIT_PROPAGATE_RELOAD_TO, + UNIT_PROPAGATE_RELOAD_FROM, + /* Reference information for GC logic */ UNIT_REFERENCES, /* Inverse of 'references' is 'referenced_by' */ UNIT_REFERENCED_BY, |