diff options
author | Stephen Gallagher <sgallagh@redhat.com> | 2011-01-28 07:40:58 -0500 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2011-02-03 12:16:13 -0500 |
commit | c210c160f6b82b6e2369f2a2fba6ea559ee54dbe (patch) | |
tree | f954c205d566f5ca4d0f37461058c3cdd2e219c3 | |
parent | f716f4d39d5165da873ac923c9832a16c9a97f55 (diff) | |
download | sssd-c210c160f6b82b6e2369f2a2fba6ea559ee54dbe.tar.gz sssd-c210c160f6b82b6e2369f2a2fba6ea559ee54dbe.tar.bz2 sssd-c210c160f6b82b6e2369f2a2fba6ea559ee54dbe.zip |
Add additional indexing for sysdb
Adds an index for dataExpireTimestamp
This is used for determining which users need to be removed during
the cleanup task. If enumeration is enabled (or huge numbers of
users have been cached), the cleanup task runs very slowly due to
the non-indexed search.
Also adds an index for ONELEVEL lookups, to speed up situations
where we would need to request all entries under a particular node
in the LDB.
-rw-r--r-- | src/db/sysdb.c | 113 | ||||
-rw-r--r-- | src/db/sysdb_private.h | 5 |
2 files changed, 117 insertions, 1 deletions
diff --git a/src/db/sysdb.c b/src/db/sysdb.c index 8806fe05..b7624af7 100644 --- a/src/db/sysdb.c +++ b/src/db/sysdb.c @@ -1405,6 +1405,114 @@ done: return ret; } +static int sysdb_upgrade_05(struct sysdb_ctx *ctx, const char **ver) +{ + TALLOC_CTX *tmp_ctx; + int ret; + struct ldb_message *msg; + + tmp_ctx = talloc_new(ctx); + if (!tmp_ctx) { + return ENOMEM; + } + + DEBUG(0, ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_6)); + + ret = ldb_transaction_start(ctx->ldb); + if (ret != LDB_SUCCESS) { + ret = EIO; + goto done; + } + + /* Add new indexes */ + msg = ldb_msg_new(tmp_ctx); + if (!msg) { + ret = ENOMEM; + goto done; + } + msg->dn = ldb_dn_new(tmp_ctx, ctx->ldb, "@INDEXLIST"); + if (!msg->dn) { + ret = ENOMEM; + goto done; + } + + /* Add Index for dataExpireTimestamp */ + ret = ldb_msg_add_empty(msg, "@IDXATTR", LDB_FLAG_MOD_ADD, NULL); + if (ret != LDB_SUCCESS) { + ret = ENOMEM; + goto done; + } + ret = ldb_msg_add_string(msg, "@IDXATTR", "dataExpireTimestamp"); + if (ret != LDB_SUCCESS) { + ret = ENOMEM; + goto done; + } + + /* Add index to speed up ONELEVEL searches */ + ret = ldb_msg_add_empty(msg, "@IDXONE", LDB_FLAG_MOD_ADD, NULL); + if (ret != LDB_SUCCESS) { + ret = ENOMEM; + goto done; + } + ret = ldb_msg_add_string(msg, "@IDXONE", "1"); + if (ret != LDB_SUCCESS) { + ret = ENOMEM; + goto done; + } + + ret = ldb_modify(ctx->ldb, msg); + if (ret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(ret); + goto done; + } + + /* conversion done, upgrade version number */ + msg = ldb_msg_new(tmp_ctx); + if (!msg) { + ret = ENOMEM; + goto done; + } + msg->dn = ldb_dn_new(tmp_ctx, ctx->ldb, "cn=sysdb"); + if (!msg->dn) { + ret = ENOMEM; + goto done; + } + + ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); + if (ret != LDB_SUCCESS) { + ret = ENOMEM; + goto done; + } + ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_6); + if (ret != LDB_SUCCESS) { + ret = ENOMEM; + goto done; + } + + ret = ldb_modify(ctx->ldb, msg); + if (ret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(ret); + goto done; + } + + ret = EOK; + +done: + talloc_zfree(tmp_ctx); + + if (ret != EOK) { + ret = ldb_transaction_cancel(ctx->ldb); + } else { + ret = ldb_transaction_commit(ctx->ldb); + *ver = SYSDB_VERSION_0_6; + } + if (ret != LDB_SUCCESS) { + ret = EIO; + } + + return ret; +} + static int sysdb_domain_init_internal(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, const char *db_path, @@ -1526,6 +1634,11 @@ static int sysdb_domain_init_internal(TALLOC_CTX *mem_ctx, ret = sysdb_upgrade_04(ctx, &version); goto done; } + + if (strcmp(version, SYSDB_VERSION_0_5) == 0) { + ret = sysdb_upgrade_05(ctx, &version); + goto done; + } } DEBUG(0,("Unknown DB version [%s], expected [%s] for domain %s!\n", diff --git a/src/db/sysdb_private.h b/src/db/sysdb_private.h index 676dbddf..3e921560 100644 --- a/src/db/sysdb_private.h +++ b/src/db/sysdb_private.h @@ -23,13 +23,14 @@ #ifndef __INT_SYS_DB_H__ #define __INT_SYS_DB_H__ +#define SYSDB_VERSION_0_6 "0.6" #define SYSDB_VERSION_0_5 "0.5" #define SYSDB_VERSION_0_4 "0.4" #define SYSDB_VERSION_0_3 "0.3" #define SYSDB_VERSION_0_2 "0.2" #define SYSDB_VERSION_0_1 "0.1" -#define SYSDB_VERSION SYSDB_VERSION_0_5 +#define SYSDB_VERSION SYSDB_VERSION_0_6 #define SYSDB_BASE_LDIF \ "dn: @ATTRIBUTES\n" \ @@ -48,7 +49,9 @@ "@IDXATTR: uidNumber\n" \ "@IDXATTR: gidNumber\n" \ "@IDXATTR: lastUpdate\n" \ + "@IDXATTR: dataExpireTimestamp\n" \ "@IDXATTR: originalDN\n" \ + "@IDXONE: 1\n" \ "\n" \ "dn: @MODULES\n" \ "@LIST: asq,memberof\n" \ |