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 /src/db/sysdb.c | |
parent | f716f4d39d5165da873ac923c9832a16c9a97f55 (diff) | |
download | sssd-c210c160f6b82b6e2369f2a2fba6ea559ee54dbe.tar.gz sssd-c210c160f6b82b6e2369f2a2fba6ea559ee54dbe.tar.xz 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.
Diffstat (limited to 'src/db/sysdb.c')
-rw-r--r-- | src/db/sysdb.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/db/sysdb.c b/src/db/sysdb.c index 8806fe05f..b7624af78 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", |