URL: https://github.com/SSSD/sssd/pull/1006 Author: elkoniu Title: #1006: LDAP: Netgroups refresh in background task Action: synchronized
To pull the PR as Git branch: git remote add ghsssd https://github.com/SSSD/sssd git fetch ghsssd pull/1006/head:pr1006 git checkout pr1006
From bf02aa268efeccaca7b02c3202d3888845925a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Po=C5=82awski?= <[email protected]> Date: Thu, 12 Mar 2020 22:46:47 +0100 Subject: [PATCH 1/2] LDAP: Netgroups refresh in background task refresh_expired_interval config value spawns be_task responsible for refreshing expired cache entries in background. Netgroup related entries are stored in persistent cache rather than timestamp cache. After sdap_refresh_step() has been replaced by generic be_refresh_step() lookup routine was searching for entries only in timestamp cache. This result in LDAP netgroup entries not refreshing in background. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1779486 --- src/providers/be_refresh.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/providers/be_refresh.c b/src/providers/be_refresh.c index 5e43571ce8..abd8ef91d3 100644 --- a/src/providers/be_refresh.c +++ b/src/providers/be_refresh.c @@ -35,7 +35,8 @@ static errno_t be_refresh_get_values_ex(TALLOC_CTX *mem_ctx, struct ldb_dn *base_dn, const char *key_attr, const char *value_attr, - char ***_values) + char ***_values, + int optflags) { TALLOC_CTX *tmp_ctx = NULL; const char *attrs[] = {value_attr, NULL}; @@ -64,7 +65,7 @@ static errno_t be_refresh_get_values_ex(TALLOC_CTX *mem_ctx, ret = sysdb_search_with_ts_attr(tmp_ctx, domain, base_dn, LDB_SCOPE_SUBTREE, - SYSDB_SEARCH_WITH_TS_ONLY_TS_FILTER, + optflags, filter, attrs, &res); if (ret != EOK) { @@ -102,6 +103,7 @@ static errno_t be_refresh_get_values(TALLOC_CTX *mem_ctx, struct ldb_dn *base_dn = NULL; errno_t ret; const char *key_attr; + int optflags = SYSDB_SEARCH_WITH_TS_ONLY_TS_FILTER; switch (type) { case BE_REFRESH_TYPE_INITGROUPS: @@ -118,6 +120,8 @@ static errno_t be_refresh_get_values(TALLOC_CTX *mem_ctx, break; case BE_REFRESH_TYPE_NETGROUPS: key_attr = SYSDB_CACHE_EXPIRE; + // Netgroup will reside in persistent cache rather than timestamp one + optflags = SYSDB_SEARCH_WITH_TS_ONLY_SYSDB_FILTER; base_dn = sysdb_netgroup_base_dn(mem_ctx, domain); break; default: @@ -132,7 +136,8 @@ static errno_t be_refresh_get_values(TALLOC_CTX *mem_ctx, ret = be_refresh_get_values_ex(mem_ctx, domain, period, base_dn, key_attr, - attr_name, _values); + attr_name, _values, + optflags); talloc_free(base_dn); return ret; From 2be443e72cb54ff1ab8b502fcdc1d241f51e1ac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Po=C5=82awski?= <[email protected]> Date: Fri, 13 Mar 2020 00:57:55 +0000 Subject: [PATCH 2/2] SYSDB: Cache selector as enum Sysdb has two sources of cache: timestamp based and persistent. This change changes implementation of that selector from binary flag to enum. --- src/db/sysdb.h | 9 +++++--- src/db/sysdb_search.c | 32 ++++++++++++++++++++++---- src/providers/be_refresh.c | 13 +++++------ src/tests/cmocka/test_sysdb_ts_cache.c | 10 ++++---- 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/db/sysdb.h b/src/db/sysdb.h index 296e226de2..20ef1f5267 100644 --- a/src/db/sysdb.h +++ b/src/db/sysdb.h @@ -1222,14 +1222,17 @@ int sysdb_search_users(TALLOC_CTX *mem_ctx, size_t *msgs_count, struct ldb_message ***msgs); -#define SYSDB_SEARCH_WITH_TS_ONLY_TS_FILTER 0x0001 -#define SYSDB_SEARCH_WITH_TS_ONLY_SYSDB_FILTER 0x0002 +enum sysdb_cache_type { + SYSDB_CACHE_TYPE_NONE, + SYSDB_CACHE_TYPE_TIMESTAMP, + SYSDB_CACHE_TYPE_PERSISTENT +}; errno_t sysdb_search_with_ts_attr(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, struct ldb_dn *base_dn, enum ldb_scope scope, - int optflags, + enum sysdb_cache_type search_cache, const char *filter, const char *attrs[], struct ldb_result **_result); diff --git a/src/db/sysdb_search.c b/src/db/sysdb_search.c index a71c43112e..48a2bb16c6 100644 --- a/src/db/sysdb_search.c +++ b/src/db/sysdb_search.c @@ -639,7 +639,7 @@ errno_t sysdb_search_with_ts_attr(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, struct ldb_dn *base_dn, enum ldb_scope scope, - int optflags, + enum sysdb_cache_type search_cache, const char *filter, const char *attrs[], struct ldb_result **_res) @@ -666,7 +666,9 @@ errno_t sysdb_search_with_ts_attr(TALLOC_CTX *mem_ctx, goto done; } - if (optflags & SYSDB_SEARCH_WITH_TS_ONLY_SYSDB_FILTER) { + switch (search_cache) { + case SYSDB_CACHE_TYPE_PERSISTENT: + { /* We only care about searching the persistent db */ ts_cache_res = talloc_zero(tmp_ctx, struct ldb_result); if (ts_cache_res == NULL) { @@ -675,7 +677,13 @@ errno_t sysdb_search_with_ts_attr(TALLOC_CTX *mem_ctx, } ts_cache_res->count = 0; ts_cache_res->msgs = NULL; - } else { + + break; + } + + case SYSDB_CACHE_TYPE_TIMESTAMP: + default: + { /* Because the timestamp database does not contain all the * attributes, we need to search the persistent db for each * of the entries found and merge the results @@ -708,9 +716,14 @@ errno_t sysdb_search_with_ts_attr(TALLOC_CTX *mem_ctx, if (ret != EOK) { goto done; } + + break; + } } - if (optflags & SYSDB_SEARCH_WITH_TS_ONLY_TS_FILTER) { + switch (search_cache) { + case SYSDB_CACHE_TYPE_TIMESTAMP: + { /* The filter only contains timestamp attrs, no need to search the * persistent db */ @@ -718,7 +731,13 @@ errno_t sysdb_search_with_ts_attr(TALLOC_CTX *mem_ctx, res->count = ts_cache_res->count; res->msgs = talloc_steal(res, ts_cache_res->msgs); } - } else { + + break; + } + + case SYSDB_CACHE_TYPE_PERSISTENT: + default: + { /* Because some of the attributes being searched might exist in the persistent * database only, we also search the persistent db */ @@ -738,6 +757,9 @@ errno_t sysdb_search_with_ts_attr(TALLOC_CTX *mem_ctx, ret = ENOMEM; goto done; } + + break; + } } *_res = talloc_steal(mem_ctx, res); diff --git a/src/providers/be_refresh.c b/src/providers/be_refresh.c index abd8ef91d3..01cbf03e24 100644 --- a/src/providers/be_refresh.c +++ b/src/providers/be_refresh.c @@ -35,8 +35,8 @@ static errno_t be_refresh_get_values_ex(TALLOC_CTX *mem_ctx, struct ldb_dn *base_dn, const char *key_attr, const char *value_attr, - char ***_values, - int optflags) + enum sysdb_cache_type search_cache, + char ***_values) { TALLOC_CTX *tmp_ctx = NULL; const char *attrs[] = {value_attr, NULL}; @@ -65,7 +65,7 @@ static errno_t be_refresh_get_values_ex(TALLOC_CTX *mem_ctx, ret = sysdb_search_with_ts_attr(tmp_ctx, domain, base_dn, LDB_SCOPE_SUBTREE, - optflags, + search_cache, filter, attrs, &res); if (ret != EOK) { @@ -103,7 +103,7 @@ static errno_t be_refresh_get_values(TALLOC_CTX *mem_ctx, struct ldb_dn *base_dn = NULL; errno_t ret; const char *key_attr; - int optflags = SYSDB_SEARCH_WITH_TS_ONLY_TS_FILTER; + enum sysdb_cache_type search_cache = SYSDB_CACHE_TYPE_TIMESTAMP; switch (type) { case BE_REFRESH_TYPE_INITGROUPS: @@ -121,7 +121,7 @@ static errno_t be_refresh_get_values(TALLOC_CTX *mem_ctx, case BE_REFRESH_TYPE_NETGROUPS: key_attr = SYSDB_CACHE_EXPIRE; // Netgroup will reside in persistent cache rather than timestamp one - optflags = SYSDB_SEARCH_WITH_TS_ONLY_SYSDB_FILTER; + search_cache = SYSDB_CACHE_TYPE_PERSISTENT; base_dn = sysdb_netgroup_base_dn(mem_ctx, domain); break; default: @@ -136,8 +136,7 @@ static errno_t be_refresh_get_values(TALLOC_CTX *mem_ctx, ret = be_refresh_get_values_ex(mem_ctx, domain, period, base_dn, key_attr, - attr_name, _values, - optflags); + attr_name, search_cache, _values); talloc_free(base_dn); return ret; diff --git a/src/tests/cmocka/test_sysdb_ts_cache.c b/src/tests/cmocka/test_sysdb_ts_cache.c index d2296d1b80..ae8b1b16c3 100644 --- a/src/tests/cmocka/test_sysdb_ts_cache.c +++ b/src/tests/cmocka/test_sysdb_ts_cache.c @@ -1438,7 +1438,7 @@ static void test_sysdb_search_with_ts(void **state) test_ctx->tctx->dom, base_dn, LDB_SCOPE_SUBTREE, - 0, + SYSDB_CACHE_TYPE_NONE, SYSDB_NAME"=*", attrs, &res); @@ -1523,7 +1523,7 @@ static void test_sysdb_search_with_ts(void **state) test_ctx->tctx->dom, base_dn, LDB_SCOPE_SUBTREE, - 0, + SYSDB_CACHE_TYPE_NONE, filter, attrs, &res); @@ -1552,7 +1552,7 @@ static void test_sysdb_search_with_ts(void **state) test_ctx->tctx->dom, base_dn, LDB_SCOPE_SUBTREE, - SYSDB_SEARCH_WITH_TS_ONLY_TS_FILTER, + SYSDB_CACHE_TYPE_TIMESTAMP, filter, attrs, &res); @@ -1571,7 +1571,7 @@ static void test_sysdb_search_with_ts(void **state) test_ctx->tctx->dom, base_dn, LDB_SCOPE_SUBTREE, - SYSDB_SEARCH_WITH_TS_ONLY_SYSDB_FILTER, + SYSDB_CACHE_TYPE_PERSISTENT, filter, attrs, &res); @@ -1596,7 +1596,7 @@ static void test_sysdb_search_with_ts(void **state) test_ctx->tctx->dom, base_dn, LDB_SCOPE_SUBTREE, - 0, + SYSDB_CACHE_TYPE_NONE, filter, attrs, &res);
_______________________________________________ sssd-devel mailing list -- [email protected] To unsubscribe send an email to [email protected] Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedorahosted.org/archives/list/[email protected]
