Blob Blame History Raw
From 85fed431388c7f7f70dbf5bcd0b4f8a889c60bc6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= <fidencio@redhat.com>
Date: Tue, 16 Aug 2016 11:46:41 +0200
Subject: [PATCH 11/39] SYSDB: Remove the timestamp cache for a newly created
 cache
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

As many users are used to remove the persistent cache without removing
the timestamp cache, let's throw away the timestamp cache in this case.

Resolves:
https://fedorahosted.org/sssd/ticket/3128

Signed-off-by: Fabiano FidĂȘncio <fidencio@redhat.com>

Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
(cherry picked from commit 9023bf51de6c84337af024388f1860ac1051924c)
---
 src/db/sysdb_init.c | 69 ++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 47 insertions(+), 22 deletions(-)

diff --git a/src/db/sysdb_init.c b/src/db/sysdb_init.c
index 59934701c4d2b9d770385a202af058404a6d3eb9..c387c1b12c116f38d5a13f1adeac5ef64d593af8 100644
--- a/src/db/sysdb_init.c
+++ b/src/db/sysdb_init.c
@@ -511,12 +511,30 @@ done:
     return ret;
 }
 
+static errno_t remove_ts_cache(struct sysdb_ctx *sysdb)
+{
+    errno_t ret;
+
+    if (sysdb->ldb_ts_file == NULL) {
+        return EOK;
+    }
+
+    ret = unlink(sysdb->ldb_ts_file);
+    if (ret != EOK && errno != ENOENT) {
+        return errno;
+    }
+
+    return EOK;
+}
+
 static errno_t sysdb_cache_connect_helper(TALLOC_CTX *mem_ctx,
+                                          struct sysdb_ctx *sysdb,
                                           struct sss_domain_info *domain,
                                           const char *ldb_file,
                                           int flags,
                                           const char *exp_version,
                                           const char *base_ldif,
+                                          bool *_newly_created,
                                           struct ldb_context **_ldb,
                                           const char **_version)
 {
@@ -527,6 +545,7 @@ static errno_t sysdb_cache_connect_helper(TALLOC_CTX *mem_ctx,
     const char *version = NULL;
     int ret;
     struct ldb_context *ldb;
+    bool newly_created;
 
     tmp_ctx = talloc_new(NULL);
     if (!tmp_ctx) {
@@ -592,8 +611,9 @@ static errno_t sysdb_cache_connect_helper(TALLOC_CTX *mem_ctx,
         goto done;
     }
 
-    /* The cache has been newly created.
-     * We need to reopen the LDB to ensure that
+    newly_created = true;
+
+    /* We need to reopen the LDB to ensure that
      * all of the special values take effect
      * (such as enabling the memberOf plugin and
      * the various indexes).
@@ -613,6 +633,9 @@ static errno_t sysdb_cache_connect_helper(TALLOC_CTX *mem_ctx,
     }
 done:
     if (ret == EOK) {
+        if (_newly_created != NULL) {
+            *_newly_created = newly_created;
+        }
         *_ldb = talloc_steal(mem_ctx, ldb);
     }
     talloc_free(tmp_ctx);
@@ -625,9 +648,27 @@ static errno_t sysdb_cache_connect(TALLOC_CTX *mem_ctx,
                                    struct ldb_context **ldb,
                                    const char **version)
 {
-    return sysdb_cache_connect_helper(mem_ctx, domain, sysdb->ldb_file,
+    bool newly_created;
+    bool ldb_file_exists;
+    errno_t ret;
+
+    ldb_file_exists = !(access(sysdb->ldb_file, F_OK) == -1 && errno == ENOENT);
+
+    ret = sysdb_cache_connect_helper(mem_ctx, sysdb, domain, sysdb->ldb_file,
                                       0, SYSDB_VERSION, SYSDB_BASE_LDIF,
-                                      ldb, version);
+                                      &newly_created, ldb, version);
+
+    /* The cache has been newly created. */
+    if (ret == EOK && newly_created && !ldb_file_exists) {
+        ret = remove_ts_cache(sysdb);
+        if (ret != EOK) {
+            DEBUG(SSSDBG_MINOR_FAILURE,
+                  "Could not delete the timestamp ldb file (%d) (%s)\n",
+                  ret, sss_strerror(ret));
+        }
+    }
+
+    return ret;
 }
 
 static errno_t sysdb_ts_cache_connect(TALLOC_CTX *mem_ctx,
@@ -636,28 +677,12 @@ static errno_t sysdb_ts_cache_connect(TALLOC_CTX *mem_ctx,
                                       struct ldb_context **ldb,
                                       const char **version)
 {
-    return sysdb_cache_connect_helper(mem_ctx, domain, sysdb->ldb_ts_file,
+    return sysdb_cache_connect_helper(mem_ctx, sysdb, domain, sysdb->ldb_ts_file,
                                       LDB_FLG_NOSYNC, SYSDB_TS_VERSION,
-                                      SYSDB_TS_BASE_LDIF,
+                                      SYSDB_TS_BASE_LDIF, NULL,
                                       ldb, version);
 }
 
-static errno_t remove_ts_cache(struct sysdb_ctx *sysdb)
-{
-    errno_t ret;
-
-    if (sysdb->ldb_ts_file == NULL) {
-        return EOK;
-    }
-
-    ret = unlink(sysdb->ldb_ts_file);
-    if (ret != EOK && errno != ENOENT) {
-        return errno;
-    }
-
-    return EOK;
-}
-
 static int sysdb_domain_cache_connect(struct sysdb_ctx *sysdb,
                                       struct sss_domain_info *domain,
                                       struct sysdb_dom_upgrade_ctx *upgrade_ctx)
-- 
2.9.3