mirror of
https://github.com/systemd/systemd.git
synced 2025-03-24 14:50:17 +03:00
Merge pull request #898 from poettering/machined-fix-reload
Fix for #376, plus some other fixes
This commit is contained in:
commit
3996b5251d
@ -2511,7 +2511,7 @@ int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *err
|
||||
r = sd_bus_message_read(message, "uoss", &id, &path, &unit, &result);
|
||||
if (r < 0) {
|
||||
bus_log_parse_error(r);
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (m->action_job && streq(m->action_job, path)) {
|
||||
@ -2520,8 +2520,7 @@ int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *err
|
||||
/* Tell people that they now may take a lock again */
|
||||
send_prepare_for(m, m->action_what, false);
|
||||
|
||||
free(m->action_job);
|
||||
m->action_job = NULL;
|
||||
m->action_job = mfree(m->action_job);
|
||||
m->action_unit = NULL;
|
||||
m->action_what = 0;
|
||||
return 0;
|
||||
@ -2530,10 +2529,8 @@ int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *err
|
||||
session = hashmap_get(m->session_units, unit);
|
||||
if (session) {
|
||||
|
||||
if (streq_ptr(path, session->scope_job)) {
|
||||
free(session->scope_job);
|
||||
session->scope_job = NULL;
|
||||
}
|
||||
if (streq_ptr(path, session->scope_job))
|
||||
session->scope_job = mfree(session->scope_job);
|
||||
|
||||
session_jobs_reply(session, unit, result);
|
||||
|
||||
@ -2545,19 +2542,14 @@ int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *err
|
||||
user = hashmap_get(m->user_units, unit);
|
||||
if (user) {
|
||||
|
||||
if (streq_ptr(path, user->service_job)) {
|
||||
free(user->service_job);
|
||||
user->service_job = NULL;
|
||||
}
|
||||
if (streq_ptr(path, user->service_job))
|
||||
user->service_job = mfree(user->service_job);
|
||||
|
||||
if (streq_ptr(path, user->slice_job)) {
|
||||
free(user->slice_job);
|
||||
user->slice_job = NULL;
|
||||
}
|
||||
if (streq_ptr(path, user->slice_job))
|
||||
user->slice_job = mfree(user->slice_job);
|
||||
|
||||
LIST_FOREACH(sessions_by_user, session, user->sessions) {
|
||||
LIST_FOREACH(sessions_by_user, session, user->sessions)
|
||||
session_jobs_reply(session, unit, result);
|
||||
}
|
||||
|
||||
user_save(user);
|
||||
user_add_to_gc_queue(user);
|
||||
@ -2579,7 +2571,7 @@ int match_unit_removed(sd_bus_message *message, void *userdata, sd_bus_error *er
|
||||
r = sd_bus_message_read(message, "so", &unit, &path);
|
||||
if (r < 0) {
|
||||
bus_log_parse_error(r);
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
session = hashmap_get(m->session_units, unit);
|
||||
@ -2611,8 +2603,10 @@ int match_properties_changed(sd_bus_message *message, void *userdata, sd_bus_err
|
||||
r = unit_name_from_dbus_path(path, &unit);
|
||||
if (r == -EINVAL) /* not a unit */
|
||||
return 0;
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r < 0) {
|
||||
log_oom();
|
||||
return 0;
|
||||
}
|
||||
|
||||
session = hashmap_get(m->session_units, unit);
|
||||
if (session)
|
||||
@ -2637,7 +2631,7 @@ int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error
|
||||
r = sd_bus_message_read(message, "b", &b);
|
||||
if (r < 0) {
|
||||
bus_log_parse_error(r);
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (b)
|
||||
|
@ -656,7 +656,6 @@ int session_stop(Session *s, bool force) {
|
||||
}
|
||||
|
||||
int session_finalize(Session *s) {
|
||||
int r = 0;
|
||||
SessionDevice *sd;
|
||||
|
||||
assert(s);
|
||||
@ -682,7 +681,7 @@ int session_finalize(Session *s) {
|
||||
while ((sd = hashmap_first(s->devices)))
|
||||
session_device_free(sd);
|
||||
|
||||
unlink(s->state_file);
|
||||
(void) unlink(s->state_file);
|
||||
session_add_to_gc_queue(s);
|
||||
user_add_to_gc_queue(s->user);
|
||||
|
||||
@ -702,7 +701,7 @@ int session_finalize(Session *s) {
|
||||
user_save(s->user);
|
||||
user_send_changed(s->user, "Sessions", "Display", NULL);
|
||||
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int release_timeout_callback(sd_event_source *es, uint64_t usec, void *userdata) {
|
||||
|
@ -907,8 +907,8 @@ static void manager_gc(Manager *m, bool drop_not_started) {
|
||||
session_get_state(session) != SESSION_CLOSING)
|
||||
session_stop(session, false);
|
||||
|
||||
/* Normally, this should make the session busy again,
|
||||
* if it doesn't then let's get rid of it
|
||||
/* Normally, this should make the session referenced
|
||||
* again, if it doesn't then let's get rid of it
|
||||
* immediately */
|
||||
if (!session_check_gc(session, drop_not_started)) {
|
||||
session_finalize(session);
|
||||
|
@ -231,11 +231,11 @@ static void machine_unlink(Machine *m) {
|
||||
char *sl;
|
||||
|
||||
sl = strjoina("/run/systemd/machines/unit:", m->unit);
|
||||
unlink(sl);
|
||||
(void) unlink(sl);
|
||||
}
|
||||
|
||||
if (m->state_file)
|
||||
unlink(m->state_file);
|
||||
(void) unlink(m->state_file);
|
||||
}
|
||||
|
||||
int machine_load(Machine *m) {
|
||||
@ -419,7 +419,19 @@ static int machine_stop_scope(Machine *m) {
|
||||
}
|
||||
|
||||
int machine_stop(Machine *m) {
|
||||
int r = 0, k;
|
||||
int r;
|
||||
assert(m);
|
||||
|
||||
r = machine_stop_scope(m);
|
||||
|
||||
m->stopping = true;
|
||||
|
||||
machine_save(m);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
int machine_finalize(Machine *m) {
|
||||
assert(m);
|
||||
|
||||
if (m->started)
|
||||
@ -430,20 +442,15 @@ int machine_stop(Machine *m) {
|
||||
LOG_MESSAGE("Machine %s terminated.", m->name),
|
||||
NULL);
|
||||
|
||||
/* Kill cgroup */
|
||||
k = machine_stop_scope(m);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
|
||||
machine_unlink(m);
|
||||
machine_add_to_gc_queue(m);
|
||||
|
||||
if (m->started)
|
||||
if (m->started) {
|
||||
machine_send_signal(m, false);
|
||||
m->started = false;
|
||||
}
|
||||
|
||||
m->started = false;
|
||||
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool machine_check_gc(Machine *m, bool drop_not_started) {
|
||||
@ -474,8 +481,11 @@ void machine_add_to_gc_queue(Machine *m) {
|
||||
MachineState machine_get_state(Machine *s) {
|
||||
assert(s);
|
||||
|
||||
if (s->stopping)
|
||||
return MACHINE_CLOSING;
|
||||
|
||||
if (s->scope_job)
|
||||
return s->started ? MACHINE_OPENING : MACHINE_CLOSING;
|
||||
return MACHINE_OPENING;
|
||||
|
||||
return MACHINE_RUNNING;
|
||||
}
|
||||
|
@ -67,7 +67,6 @@ struct Machine {
|
||||
char *name;
|
||||
sd_id128_t id;
|
||||
|
||||
MachineState state;
|
||||
MachineClass class;
|
||||
|
||||
char *state_file;
|
||||
@ -83,6 +82,7 @@ struct Machine {
|
||||
|
||||
bool in_gc_queue:1;
|
||||
bool started:1;
|
||||
bool stopping:1;
|
||||
|
||||
sd_bus_message *create_message;
|
||||
|
||||
@ -101,6 +101,7 @@ bool machine_check_gc(Machine *m, bool drop_not_started);
|
||||
void machine_add_to_gc_queue(Machine *m);
|
||||
int machine_start(Machine *m, sd_bus_message *properties, sd_bus_error *error);
|
||||
int machine_stop(Machine *m);
|
||||
int machine_finalize(Machine *m);
|
||||
int machine_save(Machine *m);
|
||||
int machine_load(Machine *m);
|
||||
int machine_kill(Machine *m, KillWho who, int signo);
|
||||
|
@ -1116,7 +1116,7 @@ int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *err
|
||||
r = sd_bus_message_read(message, "uoss", &id, &path, &unit, &result);
|
||||
if (r < 0) {
|
||||
bus_log_parse_error(r);
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
machine = hashmap_get(m->machine_units, unit);
|
||||
@ -1124,8 +1124,7 @@ int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *err
|
||||
return 0;
|
||||
|
||||
if (streq_ptr(path, machine->scope_job)) {
|
||||
free(machine->scope_job);
|
||||
machine->scope_job = NULL;
|
||||
machine->scope_job = mfree(machine->scope_job);
|
||||
|
||||
if (machine->started) {
|
||||
if (streq(result, "done"))
|
||||
@ -1137,8 +1136,9 @@ int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *err
|
||||
|
||||
machine_send_create_reply(machine, &e);
|
||||
}
|
||||
} else
|
||||
machine_save(machine);
|
||||
}
|
||||
|
||||
machine_save(machine);
|
||||
}
|
||||
|
||||
machine_add_to_gc_queue(machine);
|
||||
@ -1147,7 +1147,7 @@ int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *err
|
||||
|
||||
int match_properties_changed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
_cleanup_free_ char *unit = NULL;
|
||||
const char *path, *interface;
|
||||
const char *path;
|
||||
Manager *m = userdata;
|
||||
Machine *machine;
|
||||
int r;
|
||||
@ -1171,36 +1171,6 @@ int match_properties_changed(sd_bus_message *message, void *userdata, sd_bus_err
|
||||
if (!machine)
|
||||
return 0;
|
||||
|
||||
r = sd_bus_message_read(message, "s", &interface);
|
||||
if (r < 0) {
|
||||
bus_log_parse_error(r);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (streq(interface, "org.freedesktop.systemd1.Unit")) {
|
||||
struct properties {
|
||||
char *active_state;
|
||||
char *sub_state;
|
||||
} properties = {};
|
||||
|
||||
const struct bus_properties_map map[] = {
|
||||
{ "ActiveState", "s", NULL, offsetof(struct properties, active_state) },
|
||||
{ "SubState", "s", NULL, offsetof(struct properties, sub_state) },
|
||||
{}
|
||||
};
|
||||
|
||||
r = bus_message_map_properties_changed(message, map, &properties);
|
||||
if (r < 0)
|
||||
bus_log_parse_error(r);
|
||||
else if (streq_ptr(properties.active_state, "inactive") ||
|
||||
streq_ptr(properties.active_state, "failed") ||
|
||||
streq_ptr(properties.sub_state, "auto-restart"))
|
||||
machine_release_unit(machine);
|
||||
|
||||
free(properties.active_state);
|
||||
free(properties.sub_state);
|
||||
}
|
||||
|
||||
machine_add_to_gc_queue(machine);
|
||||
return 0;
|
||||
}
|
||||
@ -1224,9 +1194,7 @@ int match_unit_removed(sd_bus_message *message, void *userdata, sd_bus_error *er
|
||||
if (!machine)
|
||||
return 0;
|
||||
|
||||
machine_release_unit(machine);
|
||||
machine_add_to_gc_queue(machine);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1242,7 +1210,7 @@ int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error
|
||||
r = sd_bus_message_read(message, "b", &b);
|
||||
if (r < 0) {
|
||||
bus_log_parse_error(r);
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
if (b)
|
||||
return 0;
|
||||
|
@ -247,8 +247,16 @@ void manager_gc(Manager *m, bool drop_not_started) {
|
||||
LIST_REMOVE(gc_queue, m->machine_gc_queue, machine);
|
||||
machine->in_gc_queue = false;
|
||||
|
||||
if (!machine_check_gc(machine, drop_not_started)) {
|
||||
/* First, if we are not closing yet, initiate stopping */
|
||||
if (!machine_check_gc(machine, drop_not_started) &&
|
||||
machine_get_state(machine) != MACHINE_CLOSING)
|
||||
machine_stop(machine);
|
||||
|
||||
/* Now, the stop stop probably made this referenced
|
||||
* again, but if it didn't, then it's time to let it
|
||||
* go entirely. */
|
||||
if (!machine_check_gc(machine, drop_not_started)) {
|
||||
machine_finalize(machine);
|
||||
machine_free(machine);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user