core: prepare reload/reexec for varlink

This commit is contained in:
Luca Boccassi
2025-11-06 14:54:47 +00:00
parent 5b3874929a
commit 00c084fe02
4 changed files with 30 additions and 21 deletions

View File

@@ -1513,23 +1513,14 @@ static void log_caller(sd_bus_message *message, Manager *manager, const char *me
assert(manager);
assert(method);
if (sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID|SD_BUS_CREDS_PIDFD|SD_BUS_CREDS_AUGMENT|SD_BUS_CREDS_COMM, &creds) < 0)
if (sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID|SD_BUS_CREDS_PIDFD|SD_BUS_CREDS_AUGMENT, &creds) < 0)
return;
/* We need at least the PID, otherwise there's nothing to log, the rest is optional. */
if (bus_creds_get_pidref(creds, &pidref) < 0)
return;
const char *comm = NULL;
Unit *caller;
(void) sd_bus_creds_get_comm(creds, &comm);
caller = manager_get_unit_by_pidref(manager, &pidref);
log_notice("%s requested from client PID " PID_FMT "%s%s%s%s%s%s...",
method, pidref.pid,
comm ? " ('" : "", strempty(comm), comm ? "')" : "",
caller ? " (unit " : "", caller ? caller->id : "", caller ? ")" : "");
manager_log_caller(manager, &pidref, method);
}
static int method_reload(sd_bus_message *message, void *userdata, sd_bus_error *error) {
@@ -1564,8 +1555,8 @@ static int method_reload(sd_bus_message *message, void *userdata, sd_bus_error *
* is finished. That way the caller knows when the reload
* finished. */
assert(!m->pending_reload_message);
r = sd_bus_message_new_method_return(message, &m->pending_reload_message);
assert(!m->pending_reload_message_dbus);
r = sd_bus_message_new_method_return(message, &m->pending_reload_message_dbus);
if (r < 0)
return r;

View File

@@ -56,17 +56,17 @@ void bus_send_pending_reload_message(Manager *m) {
assert(m);
if (!m->pending_reload_message)
if (!m->pending_reload_message_dbus)
return;
/* If we cannot get rid of this message we won't dispatch any D-Bus messages, so that we won't end up wanting
* to queue another message. */
r = sd_bus_message_send(m->pending_reload_message);
r = sd_bus_message_send(m->pending_reload_message_dbus);
if (r < 0)
log_warning_errno(r, "Failed to send queued reload message, ignoring: %m");
m->pending_reload_message = sd_bus_message_unref(m->pending_reload_message);
m->pending_reload_message_dbus = sd_bus_message_unref(m->pending_reload_message_dbus);
return;
}
@@ -1004,8 +1004,8 @@ static void destroy_bus(Manager *m, sd_bus **bus) {
}
/* Get rid of queued message on this bus */
if (m->pending_reload_message && sd_bus_message_get_bus(m->pending_reload_message) == *bus)
m->pending_reload_message = sd_bus_message_unref(m->pending_reload_message);
if (m->pending_reload_message_dbus && sd_bus_message_get_bus(m->pending_reload_message_dbus) == *bus)
m->pending_reload_message_dbus = sd_bus_message_unref(m->pending_reload_message_dbus);
/* Possibly flush unwritten data, but only if we are
* unprivileged, since we don't want to sync here */

View File

@@ -2570,7 +2570,7 @@ static unsigned manager_dispatch_dbus_queue(Manager *m) {
/* When we are reloading, let's not wait with generating signals, since we need to exit the manager as quickly
* as we can. There's no point in throttling generation of signals in that case. */
if (MANAGER_IS_RELOADING(m) || m->send_reloading_done || m->pending_reload_message)
if (MANAGER_IS_RELOADING(m) || m->send_reloading_done || m->pending_reload_message_dbus)
budget = UINT_MAX; /* infinite budget in this case */
else {
/* Anything to do at all? */
@@ -2623,7 +2623,7 @@ static unsigned manager_dispatch_dbus_queue(Manager *m) {
n++;
}
if (m->pending_reload_message) {
if (m->pending_reload_message_dbus) {
bus_send_pending_reload_message(m);
n++;
}
@@ -5197,6 +5197,22 @@ LogTarget manager_get_executor_log_target(Manager *m) {
return log_get_target();
}
void manager_log_caller(Manager *manager, PidRef *caller, const char *method) {
_cleanup_free_ char *comm = NULL;
assert(manager);
assert(pidref_is_set(caller));
assert(method);
(void) pidref_get_comm(caller, &comm);
Unit *caller_unit = manager_get_unit_by_pidref(manager, caller);
log_notice("%s requested from client PID " PID_FMT "%s%s%s%s%s%s...",
method, caller->pid,
comm ? " ('" : "", strempty(comm), comm ? "')" : "",
caller_unit ? " (unit " : "", caller_unit ? caller_unit->id : "", caller_unit ? ")" : "");
}
static const char* const manager_state_table[_MANAGER_STATE_MAX] = {
[MANAGER_INITIALIZING] = "initializing",
[MANAGER_STARTING] = "starting",

View File

@@ -317,7 +317,7 @@ typedef struct Manager {
/* This is used during reloading: before the reload we queue
* the reply message here, and afterwards we send it */
sd_bus_message *pending_reload_message;
sd_bus_message *pending_reload_message_dbus;
Hashmap *watch_bus; /* D-Bus names => Unit object n:1 */
@@ -636,6 +636,8 @@ int manager_override_watchdog_pretimeout_governor(Manager *m, const char *govern
LogTarget manager_get_executor_log_target(Manager *m);
void manager_log_caller(Manager *manager, PidRef *caller, const char *method);
int manager_allocate_idle_pipe(Manager *m);
void unit_defaults_init(UnitDefaults *defaults, RuntimeScope scope);