From 09b23e78806d8930c3f1b9e411dc8cf464c18998 Mon Sep 17 00:00:00 2001 From: Alexey Tikhonov Date: Tue, 16 Jul 2024 13:08:02 +0200 Subject: [PATCH 4/5] TS_CACHE: never try to upgrade timestamps cache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's easier and more consistent to recreate it instead. This is a natural extension of 3b67fc6488ac10ca13561d9032f59951f82203e6 Reviewed-by: Alejandro López Reviewed-by: Sumit Bose Reviewed-by: Tomáš Halman (cherry picked from commit fc2a26c306e51b66680aef85aa0d2c41d8049a7f) --- src/db/sysdb_init.c | 103 +---------------------------------------- src/db/sysdb_upgrade.c | 45 ------------------ 2 files changed, 1 insertion(+), 147 deletions(-) diff --git a/src/db/sysdb_init.c b/src/db/sysdb_init.c index 38a9cd64a..a1d02d49c 100644 --- a/src/db/sysdb_init.c +++ b/src/db/sysdb_init.c @@ -376,57 +376,6 @@ static errno_t sysdb_cache_create_empty(struct ldb_context *ldb, return EOK; } -static errno_t sysdb_ts_cache_upgrade(TALLOC_CTX *mem_ctx, - struct sysdb_ctx *sysdb, - struct ldb_context *ldb, - struct sss_domain_info *domain, - const char *cur_version, - const char **_new_version) -{ - errno_t ret; - TALLOC_CTX *tmp_ctx; - const char *version; - struct ldb_context *save_ldb; - - tmp_ctx = talloc_new(NULL); - if (tmp_ctx == NULL) { - return ENOMEM; - } - - /* The upgrade process depends on having ldb around, yet the upgrade - * function shouldn't set the ldb pointer, only the connect function - * should after it's successful. To avoid hard refactoring, save the - * ldb pointer here and restore in the 'done' handler - */ - save_ldb = sysdb->ldb; - sysdb->ldb = ldb; - - version = talloc_strdup(tmp_ctx, cur_version); - if (version == NULL) { - ret = ENOMEM; - goto done; - } - - DEBUG(SSSDBG_CONF_SETTINGS, - "Upgrading timstamp cache of DB [%s] from version: %s\n", - domain->name, version); - - if (strcmp(version, SYSDB_TS_VERSION_0_1) == 0) { - ret = sysdb_ts_upgrade_01(sysdb, &version); - if (ret != EOK) { - goto done; - } - } - - ret = EOK; - -done: - sysdb->ldb = save_ldb; - *_new_version = version; - talloc_free(tmp_ctx); - return ret; -} - static errno_t sysdb_domain_cache_upgrade(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb, struct sysdb_dom_upgrade_ctx *upgrade_ctx, @@ -884,56 +833,6 @@ static int sysdb_timestamp_cache_connect(struct sysdb_ctx *sysdb, } ret = sysdb_ts_cache_connect(tmp_ctx, sysdb, domain, &ldb, &version); - switch (ret) { - case ERR_SYSDB_VERSION_TOO_OLD: - if (upgrade_ctx == NULL) { - DEBUG(SSSDBG_FATAL_FAILURE, - "DB version too old [%s], expected [%s] for domain %s!\n", - version, SYSDB_VERSION, domain->name); - break; - } - - ret = sysdb_ts_cache_upgrade(tmp_ctx, sysdb, ldb, domain, version, - &version); - if (ret != EOK) { - DEBUG(SSSDBG_MINOR_FAILURE, - "Could not upgrade the timestamp ldb file (%d) (%s)\n", - ret, sss_strerror(ret)); - break; - } - - /* The version should now match SYSDB_VERSION. - * If not, it means we didn't match any of the - * known older versions. The DB might be - * corrupt or generated by a newer version of - * SSSD. - */ - ret = sysdb_version_check(SYSDB_TS_VERSION, version); - if (ret == EOK) { - /* The cache has been upgraded. - * We need to reopen the LDB to ensure that - * any changes made above take effect. - */ - ret = sysdb_ldb_reconnect(tmp_ctx, - sysdb->ldb_ts_file, - LDB_FLG_NOSYNC, - &ldb); - if (ret != EOK) { - DEBUG(SSSDBG_MINOR_FAILURE, - "Could not reopen the timestamp ldb file (%d) (%s)\n", - ret, sss_strerror(ret)); - } - } - break; - case ERR_SYSDB_VERSION_TOO_NEW: - DEBUG(SSSDBG_MINOR_FAILURE, - "DB version too new [%s], expected [%s] for domain %s!\n", - version, SYSDB_TS_VERSION, domain->name); - break; - default: - break; - } - if (ret != EOK) { DEBUG(SSSDBG_MINOR_FAILURE, "The timestamps cache could not be opened. " @@ -953,7 +852,7 @@ static int sysdb_timestamp_cache_connect(struct sysdb_ctx *sysdb, ret = sysdb_ts_cache_connect(tmp_ctx, sysdb, domain, &ldb, &version); if (ret != EOK) { DEBUG(SSSDBG_MINOR_FAILURE, - "Could not delete the timestamp ldb file (%d) (%s)\n", + "sysdb_ts_cache_connect() failed after cache deletion [%d]: %s\n", ret, sss_strerror(ret)); } } diff --git a/src/db/sysdb_upgrade.c b/src/db/sysdb_upgrade.c index 328bd2962..37c0007cb 100644 --- a/src/db/sysdb_upgrade.c +++ b/src/db/sysdb_upgrade.c @@ -2774,51 +2774,6 @@ done: return ret; } -int sysdb_ts_upgrade_01(struct sysdb_ctx *sysdb, const char **ver) -{ - struct upgrade_ctx *ctx; - errno_t ret; - struct ldb_message *msg = NULL; - - ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_TS_VERSION_0_2, &ctx); - if (ret) { - return ret; - } - - /* Remove @IDXONE from index */ - talloc_free(msg); - msg = ldb_msg_new(ctx); - if (msg == NULL) { - ret = ENOMEM; - goto done; - } - - msg->dn = ldb_dn_new(msg, sysdb->ldb, "@INDEXLIST"); - if (msg->dn == NULL) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_empty(msg, "@IDXONE", LDB_FLAG_MOD_DELETE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_modify(sysdb->ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; - } - - /* conversion done, update version number */ - ret = update_version(ctx); - -done: - ret = finish_upgrade(ret, &ctx, ver); - return ret; -} - /* * Example template for future upgrades. * Copy and change version numbers as appropriate. -- 2.45.2