>From 08a4c6288d5139aa5923be4141f2b1f6074628ff Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Sat, 15 Dec 2012 16:50:31 +0100 Subject: [PATCH 7/7] AUTOFS: Clear enum cache if a request comes in from the sss_cache In order for sss_cache to work correctly, we must also signal the autofs responder to invalidate the hash table requests. --- src/monitor/monitor.c | 8 ++++++++ src/monitor/monitor_interfaces.h | 1 + src/responder/autofs/autofssrv.c | 22 ++++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c index cc6f6d55def27a48f1545136763538b8a2db0904..1fa1592a59b249be0d361e5182e315572dac2011 100644 --- a/src/monitor/monitor.c +++ b/src/monitor/monitor.c @@ -761,6 +761,10 @@ static int service_signal_clear_memcache(struct mt_svc *svc) { return service_signal(svc, MON_CLI_METHOD_CLEAR_MEMCACHE); } +static int service_signal_clear_enum_cache(struct mt_svc *svc) +{ + return service_signal(svc, MON_CLI_METHOD_CLEAR_ENUM_CACHE); +} static int check_domain_ranges(struct sss_domain_info *domains) { @@ -1346,6 +1350,10 @@ static void monitor_hup(struct tevent_context *ev, if (!strcmp(NSS_SBUS_SERVICE_NAME, cur_svc->name)) { service_signal_clear_memcache(cur_svc); } + + if (!strcmp(SSS_AUTOFS_SBUS_SERVICE_NAME, cur_svc->name)) { + service_signal_clear_enum_cache(cur_svc); + } } } diff --git a/src/monitor/monitor_interfaces.h b/src/monitor/monitor_interfaces.h index abe905035e42588b6fabd758d2fb5539a0c91beb..f27c7d00c9b920a463a7ea7ab3281422053ad5a6 100644 --- a/src/monitor/monitor_interfaces.h +++ b/src/monitor/monitor_interfaces.h @@ -46,6 +46,7 @@ #define MON_CLI_METHOD_RESET_OFFLINE "resetOffline" /* Applicable only to providers */ #define MON_CLI_METHOD_ROTATE "rotateLogs" #define MON_CLI_METHOD_CLEAR_MEMCACHE "clearMemcache" +#define MON_CLI_METHOD_CLEAR_ENUM_CACHE "clearEnumCache" #define SSSD_SERVICE_PIPE "private/sbus-monitor" diff --git a/src/responder/autofs/autofssrv.c b/src/responder/autofs/autofssrv.c index d7c10d6c91c3ea7e781eeb6f1db18035a255f95a..93deffd94fc61119e886c84412518db039ea1aad 100644 --- a/src/responder/autofs/autofssrv.c +++ b/src/responder/autofs/autofssrv.c @@ -29,10 +29,14 @@ #include "providers/data_provider.h" #include "responder/autofs/autofs_private.h" +static int autofs_clean_hash_table(DBusMessage *message, + struct sbus_connection *conn); + struct sbus_method monitor_autofs_methods[] = { { MON_CLI_METHOD_PING, monitor_common_pong }, { MON_CLI_METHOD_RES_INIT, monitor_common_res_init }, { MON_CLI_METHOD_ROTATE, responder_logrotate }, + { MON_CLI_METHOD_CLEAR_ENUM_CACHE, autofs_clean_hash_table }, { NULL, NULL } }; @@ -101,6 +105,24 @@ autofs_dp_reconnect_init(struct sbus_connection *conn, be_conn->domain->name)); } +static int autofs_clean_hash_table(DBusMessage *message, + struct sbus_connection *conn) +{ + struct resp_ctx *rctx = talloc_get_type(sbus_conn_get_private_data(conn), + struct resp_ctx); + struct autofs_ctx *actx = + talloc_get_type(rctx->pvt_ctx, struct autofs_ctx); + errno_t ret; + + ret = autofs_orphan_maps(actx); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, ("Could not invalidate maps\n")); + return ret; + } + + return monitor_common_pong(message, conn); +} + static int autofs_process_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev, -- 1.8.0.2