summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2023-01-02 15:01:56 +0100
committerLennart Poettering <lennart@poettering.net>2023-01-10 18:28:38 +0100
commitdd0ab174c36492cdcb92cf46844fb0905b1d4a7e (patch)
treeda68d0b7950bdce0f387ac0acadea66f84b91cca
parent81e19b6f6585d656e972efad73781e184ca0e7a0 (diff)
downloadsystemd-dd0ab174c36492cdcb92cf46844fb0905b1d4a7e.tar.gz
pid1: make sure we send our calling service manager RELOADING=1 when reloading
And send READY=1 again when we are done with it. We do this not only for "daemon-reload" but also for "daemon-reexec" and "switch-root", since from the perspective of an encapsulating service manager these three operations are not that different.
-rw-r--r--src/core/main.c10
-rw-r--r--src/core/manager.c12
-rw-r--r--src/core/manager.h1
-rw-r--r--units/user@.service.in2
4 files changed, 24 insertions, 1 deletions
diff --git a/src/core/main.c b/src/core/main.c
index c833050db0..94055f08de 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -1961,6 +1961,8 @@ static int invoke_main_loop(
LogTarget saved_log_target;
int saved_log_level;
+ manager_send_reloading(m);
+
log_info("Reloading.");
/* First, save any overridden log level/target, then parse the configuration file,
@@ -1991,6 +1993,10 @@ static int invoke_main_loop(
}
case MANAGER_REEXECUTE:
+
+ manager_send_reloading(m); /* From the perspective of the manager calling us this is
+ * pretty much the same as a reload */
+
r = prepare_reexecute(m, &arg_serialization, ret_fds, false);
if (r < 0) {
*ret_error_message = "Failed to prepare for reexecution";
@@ -2005,6 +2011,10 @@ static int invoke_main_loop(
return objective;
case MANAGER_SWITCH_ROOT:
+
+ manager_send_reloading(m); /* From the perspective of the manager calling us this is
+ * pretty much the same as a reload */
+
manager_set_switching_root(m, true);
if (!m->switch_root_init) {
diff --git a/src/core/manager.c b/src/core/manager.c
index 0aed7de15c..f8576cca1a 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -3648,6 +3648,18 @@ void manager_check_finished(Manager *m) {
manager_invalidate_startup_units(m);
}
+void manager_send_reloading(Manager *m) {
+ assert(m);
+
+ /* Let whoever invoked us know that we are now reloading */
+ (void) sd_notifyf(/* unset= */ false,
+ "RELOADING=1\n"
+ "MONOTONIC_USEC=" USEC_FMT "\n", now(CLOCK_MONOTONIC));
+
+ /* And ensure that we'll send READY=1 again as soon as we are ready again */
+ m->ready_sent = false;
+}
+
static bool generator_path_any(const char* const* paths) {
bool found = false;
diff --git a/src/core/manager.h b/src/core/manager.h
index 4d4b56c3cc..c13de8fe78 100644
--- a/src/core/manager.h
+++ b/src/core/manager.h
@@ -538,6 +538,7 @@ void manager_send_unit_plymouth(Manager *m, Unit *u);
bool manager_unit_inactive_or_pending(Manager *m, const char *name);
void manager_check_finished(Manager *m);
+void manager_send_reloading(Manager *m);
void disable_printk_ratelimit(void);
void manager_recheck_dbus(Manager *m);
diff --git a/units/user@.service.in b/units/user@.service.in
index 1660de0326..1558764909 100644
--- a/units/user@.service.in
+++ b/units/user@.service.in
@@ -17,7 +17,7 @@ IgnoreOnIsolate=yes
[Service]
User=%i
PAMName=systemd-user
-Type=notify
+Type=notify-reload
ExecStart={{ROOTLIBEXECDIR}}/systemd --user
Slice=user-%i.slice
KillMode=mixed