On 11/20/2012 02:22 PM, Michal Židek wrote:
Patch 1: sss_cache refactor. See patch description for more details.
Patch 2: Remove mmap cache properly in sss_userdel and sss_groupdel
Patches are attached.
Thanks
Michal
_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel
https://fedorahosted.org/sssd/ticket/1659
I modified the commit message of second patch to include link to the ticket.
Thanks
Michal
>From c02ae437e619ab97fb50123706ec1dbe2d920e72 Mon Sep 17 00:00:00 2001
From: Michal Zidek <mzi...@redhat.com>
Date: Tue, 20 Nov 2012 13:52:12 +0100
Subject: [PATCH 1/2] sss_cache: Small refactor.
The logic that checks if sssd_nss is running and then
sends SIGHUP to monitor or removes the caches was moved
to a function sss_memcache_clear_all() and made public in
tools_util.h. This function can be used by other tools
that need memory cache to be invalidated like sss_userdel
and sss_groupdel.
---
src/tools/sss_cache.c | 65 +++--------------------------------------------
src/tools/tools_util.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/tools/tools_util.h | 2 ++
3 files changed, 75 insertions(+), 61 deletions(-)
diff --git a/src/tools/sss_cache.c b/src/tools/sss_cache.c
index 368b1df..703c033 100644
--- a/src/tools/sss_cache.c
+++ b/src/tools/sss_cache.c
@@ -92,7 +92,6 @@ errno_t invalidate_entry(TALLOC_CTX *ctx, struct sysdb_ctx *sysdb,
bool invalidate_entries(TALLOC_CTX *ctx, struct sysdb_ctx *sysdb,
enum sss_cache_entry entry_type, const char *filter,
const char *name);
-static int clear_fastcache(bool *sssd_nss_is_off);
int main(int argc, const char *argv[])
{
@@ -100,9 +99,7 @@ int main(int argc, const char *argv[])
struct cache_tool_ctx *tctx = NULL;
struct sysdb_ctx *sysdb;
int i;
- bool sssd_nss_is_off;
bool skipped = true;
- FILE *clear_mc_flag;
ret = init_context(argc, argv, &tctx);
if (ret != EOK) {
@@ -145,71 +142,17 @@ int main(int argc, const char *argv[])
ret = ENOENT;
goto done;
} else {
- ret = clear_fastcache(&sssd_nss_is_off);
- if (ret != EOK) {
- DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to clear caches.\n"));
- goto done;
- }
- if (!sssd_nss_is_off) {
- /* sssd_nss is running -> signal monitor to invalidate fastcache */
- clear_mc_flag = fopen(SSS_NSS_MCACHE_DIR"/"CLEAR_MC_FLAG, "w");
- if (clear_mc_flag == NULL) {
- DEBUG(SSSDBG_CRIT_FAILURE,
- ("Failed to create clear_mc_flag file. "
- "Memory cache will not be cleared.\n"));
- goto done;
- }
- ret = fclose(clear_mc_flag);
- if (ret != 0) {
- ret = errno;
- DEBUG(SSSDBG_CRIT_FAILURE,
- ("Unable to close file descriptor: %s\n",
- strerror(ret)));
- goto done;
- }
-
- DEBUG(SSSDBG_TRACE_FUNC, ("Sending SIGHUP to monitor.\n"));
- ret = signal_sssd(SIGHUP);
- if (ret != EOK) {
- DEBUG(SSSDBG_CRIT_FAILURE,
- ("Failed to send SIGHUP to monitor.\n"));
- goto done;
- }
- }
+ ret = sss_memcache_clear_all();
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to clear memory cache.\n"));
+ goto done;
}
+ ret = EOK;
done:
if (tctx) talloc_free(tctx);
return ret;
}
-static int clear_fastcache(bool *sssd_nss_is_off)
-{
- int ret;
- ret = sss_memcache_invalidate(SSS_NSS_MCACHE_DIR"/passwd");
- if (ret != EOK) {
- if (ret == EACCES) {
- *sssd_nss_is_off = false;
- return EOK;
- } else {
- return ret;
- }
- }
-
- ret = sss_memcache_invalidate(SSS_NSS_MCACHE_DIR"/group");
- if (ret != EOK) {
- if (ret == EACCES) {
- *sssd_nss_is_off = false;
- return EOK;
- } else {
- return ret;
- }
- }
-
- *sssd_nss_is_off = true;
- return EOK;
-}
-
bool invalidate_entries(TALLOC_CTX *ctx, struct sysdb_ctx *sysdb,
enum sss_cache_entry entry_type, const char *filter,
const char *name)
diff --git a/src/tools/tools_util.c b/src/tools/tools_util.c
index 73e9413..7054359 100644
--- a/src/tools/tools_util.c
+++ b/src/tools/tools_util.c
@@ -766,3 +766,72 @@ done:
}
return ret;
}
+
+static int clear_fastcache(bool *sssd_nss_is_off)
+{
+ int ret;
+ ret = sss_memcache_invalidate(SSS_NSS_MCACHE_DIR"/passwd");
+ if (ret != EOK) {
+ if (ret == EACCES) {
+ *sssd_nss_is_off = false;
+ return EOK;
+ } else {
+ return ret;
+ }
+ }
+
+ ret = sss_memcache_invalidate(SSS_NSS_MCACHE_DIR"/group");
+ if (ret != EOK) {
+ if (ret == EACCES) {
+ *sssd_nss_is_off = false;
+ return EOK;
+ } else {
+ return ret;
+ }
+ }
+
+ *sssd_nss_is_off = true;
+ return EOK;
+}
+
+errno_t sss_memcache_clear_all(void)
+{
+ errno_t ret;
+ bool sssd_nss_is_off = false;
+ FILE *clear_mc_flag;
+
+ ret = clear_fastcache(&sssd_nss_is_off);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to clear caches.\n"));
+ return EIO;
+ }
+ if (!sssd_nss_is_off) {
+ /* sssd_nss is running -> signal monitor to invalidate fastcache */
+ clear_mc_flag = fopen(SSS_NSS_MCACHE_DIR"/"CLEAR_MC_FLAG, "w");
+ if (clear_mc_flag == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Failed to create clear_mc_flag file. "
+ "Memory cache will not be cleared.\n"));
+ return EIO;
+ }
+ ret = fclose(clear_mc_flag);
+ if (ret != 0) {
+ ret = errno;
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Unable to close file descriptor: %s\n",
+ strerror(ret)));
+ return EIO;
+ }
+ DEBUG(SSSDBG_TRACE_FUNC, ("Sending SIGHUP to monitor.\n"));
+ ret = signal_sssd(SIGHUP);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Failed to send SIGHUP to monitor.\n"));
+ return EIO;
+ }
+ }
+
+ return EOK;
+}
+
+
diff --git a/src/tools/tools_util.h b/src/tools/tools_util.h
index a83c8ee..20a2a4a 100644
--- a/src/tools/tools_util.h
+++ b/src/tools/tools_util.h
@@ -106,6 +106,8 @@ errno_t signal_sssd(int signum);
errno_t sss_memcache_invalidate(const char *mc_filename);
+errno_t sss_memcache_clear_all(void);
+
/* from files.c */
int remove_tree(const char *root);
--
1.7.11.2
>From fcc46ef79dea1075913ec8ad0c1fc0cd308bfb76 Mon Sep 17 00:00:00 2001
From: Michal Zidek <mzi...@redhat.com>
Date: Tue, 20 Nov 2012 14:07:38 +0100
Subject: [PATCH 2/2] tools: sss_userdel and sss_groupdel should clear mmap
cache
https://fedorahosted.org/sssd/ticket/1659
---
src/tools/sss_groupdel.c | 10 ++++++++++
src/tools/sss_userdel.c | 7 +++++++
2 files changed, 17 insertions(+)
diff --git a/src/tools/sss_groupdel.c b/src/tools/sss_groupdel.c
index 57c3e70..9367e34 100644
--- a/src/tools/sss_groupdel.c
+++ b/src/tools/sss_groupdel.c
@@ -106,6 +106,16 @@ int main(int argc, const char **argv)
/* groupdel */
ret = groupdel(tctx, tctx->sysdb, tctx->octx);
+ if (ret != EOK) {
+ goto done;
+ }
+
+ /* Invalidate memory caches */
+ ret = sss_memcache_clear_all();
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to clear the memory cache.\n"));
+ goto fini;
+ }
done:
if (ret) {
diff --git a/src/tools/sss_userdel.c b/src/tools/sss_userdel.c
index 5d250f6..d6c6740 100644
--- a/src/tools/sss_userdel.c
+++ b/src/tools/sss_userdel.c
@@ -301,6 +301,13 @@ int main(int argc, const char **argv)
}
}
+ /* Invalidate memory caches */
+ ret = sss_memcache_clear_all();
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to clear the memory cache.\n"));
+ goto fini;
+ }
+
done:
if (ret) {
DEBUG(1, ("sysdb operation failed (%d)[%s]\n", ret, strerror(ret)));
--
1.7.11.2
_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel