1
0
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:
Daniel Mack 2015-08-06 16:13:22 +02:00
commit 3996b5251d
7 changed files with 60 additions and 80 deletions

View File

@ -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)

View File

@ -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) {

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

View File

@ -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;

View File

@ -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);
}
}