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]

Reply via email to