machined: flush nscd caches whenever a machine comes/goes

This way, nss-mymachines should always serve authoritative data.
This commit is contained in:
Lennart Poettering
2018-12-15 12:10:19 +01:00
parent 5be61bead5
commit 9fdcbae5e2
5 changed files with 44 additions and 0 deletions
+2
View File
@@ -398,6 +398,7 @@ int machine_start(Machine *m, sd_bus_message *properties, sd_bus_error *error) {
machine_save(m);
machine_send_signal(m, true);
(void) manager_enqueue_nscd_cache_flush(m->manager);
return 0;
}
@@ -439,6 +440,7 @@ int machine_stop(Machine *m) {
m->stopping = true;
machine_save(m);
(void) manager_enqueue_nscd_cache_flush(m->manager);
return r;
}
+36
View File
@@ -0,0 +1,36 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#include "machined.h"
#include "nscd-flush.h"
#include "strv.h"
static int on_nscd_cache_flush_event(sd_event_source *s, void *userdata) {
/* Let's ask glibc's nscd daemon to flush its caches. We request this for the three database machines may show
* up in: the hosts database (for resolvable machine names) and the user and group databases (for the user ns
* ranges). */
(void) nscd_flush_cache(STRV_MAKE("passwd", "group", "hosts"));
return 0;
}
int manager_enqueue_nscd_cache_flush(Manager *m) {
int r;
assert(m);
if (!m->nscd_cache_flush_event) {
r = sd_event_add_defer(m->event, &m->nscd_cache_flush_event, on_nscd_cache_flush_event, m);
if (r < 0)
return log_error_errno(r, "Failed to allocate NSCD cache flush event: %m");
sd_event_source_set_description(m->nscd_cache_flush_event, "nscd-cache-flush");
}
r = sd_event_source_set_enabled(m->nscd_cache_flush_event, SD_EVENT_ONESHOT);
if (r < 0) {
m->nscd_cache_flush_event = sd_event_source_unref(m->nscd_cache_flush_event);
return log_error_errno(r, "Failed to enable NSCD cache flush event: %m");
}
return 0;
}
+1
View File
@@ -77,6 +77,7 @@ static Manager* manager_unref(Manager *m) {
hashmap_free(m->image_cache);
sd_event_source_unref(m->image_cache_defer_event);
sd_event_source_unref(m->nscd_cache_flush_event);
bus_verify_polkit_async_registry_free(m->polkit_registry);
+4
View File
@@ -35,6 +35,8 @@ struct Manager {
LIST_HEAD(Operation, operations);
unsigned n_operations;
sd_event_source *nscd_cache_flush_event;
};
int manager_add_machine(Manager *m, const char *name, Machine **_machine);
@@ -53,3 +55,5 @@ int manager_kill_unit(Manager *manager, const char *unit, int signo, sd_bus_erro
int manager_unref_unit(Manager *m, const char *unit, sd_bus_error *error);
int manager_unit_is_active(Manager *manager, const char *unit);
int manager_job_is_active(Manager *manager, const char *path);
int manager_enqueue_nscd_cache_flush(Manager *m);
+1
View File
@@ -9,6 +9,7 @@ libmachine_core_sources = files('''
machine.c
machine.h
machined-dbus.c
machined-core.c
machine-dbus.c
machine-dbus.h
image-dbus.c