From 50d00230cbbc4fd960ffd2ebfced826c2e671bc2 Mon Sep 17 00:00:00 2001
From: Sumit Bose <sbose@redhat.com>
Date: Thu, 27 Nov 2014 13:41:37 +0100
Subject: [PATCH 119/128] IPA: only update view data if it really changed
https://fedorahosted.org/sssd/ticket/2510
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
---
src/providers/ipa/ipa_subdomains.c | 116 +++++++++++++++++++++----------------
1 file changed, 66 insertions(+), 50 deletions(-)
diff --git a/src/providers/ipa/ipa_subdomains.c b/src/providers/ipa/ipa_subdomains.c
index d053d46ac4208bd52fcbf524a11243896b849612..3148389f71135b6c64e62d1cf7f4064dd183f595 100644
--- a/src/providers/ipa/ipa_subdomains.c
+++ b/src/providers/ipa/ipa_subdomains.c
@@ -1110,23 +1110,44 @@ static void ipa_get_view_name_done(struct tevent_req *req)
"View name changed, this is not supported at runtime. " \
"Please restart SSSD to get the new view applied.\n");
} else {
- ctx->sd_ctx->view_read_at_init = true;
- /* View name changed */
- if (ctx->sd_ctx->id_ctx->view_name != NULL) {
- ret = sysdb_transaction_start(ctx->sd_ctx->be_ctx->domain->sysdb);
- if (ret != EOK) {
- DEBUG(SSSDBG_OP_FAILURE, "sysdb_transaction_start failed.\n");
- goto done;
- }
+ if (ctx->sd_ctx->id_ctx->view_name == NULL
+ || strcmp(ctx->sd_ctx->id_ctx->view_name, view_name) != 0) {
+ /* View name changed */
- if (strcmp(ctx->sd_ctx->id_ctx->view_name,
- SYSDB_DEFAULT_VIEW_NAME) != 0) {
- /* Old view was not the default view, delete view tree */
- ret = sysdb_delete_view_tree(ctx->sd_ctx->be_ctx->domain->sysdb,
+ if (ctx->sd_ctx->id_ctx->view_name != NULL) {
+ ret = sysdb_transaction_start(
+ ctx->sd_ctx->be_ctx->domain->sysdb);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_OP_FAILURE,
+ "sysdb_transaction_start failed.\n");
+ goto done;
+ }
+
+ if (strcmp(ctx->sd_ctx->id_ctx->view_name,
+ SYSDB_DEFAULT_VIEW_NAME) != 0) {
+ /* Old view was not the default view, delete view tree */
+ ret = sysdb_delete_view_tree(
+ ctx->sd_ctx->be_ctx->domain->sysdb,
ctx->sd_ctx->id_ctx->view_name);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_OP_FAILURE,
+ "sysdb_delete_view_tree failed.\n");
+ sret = sysdb_transaction_cancel(
+ ctx->sd_ctx->be_ctx->domain->sysdb);
+ if (sret != EOK) {
+ DEBUG(SSSDBG_OP_FAILURE,
+ "sysdb_transaction_cancel failed.\n");
+ goto done;
+ }
+ goto done;
+ }
+ }
+
+ ret = sysdb_invalidate_overrides(
+ ctx->sd_ctx->be_ctx->domain->sysdb);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE,
- "sysdb_delete_view_tree failed.\n");
+ "sysdb_invalidate_overrides failed.\n");
sret = sysdb_transaction_cancel(
ctx->sd_ctx->be_ctx->domain->sysdb);
if (sret != EOK) {
@@ -1136,57 +1157,52 @@ static void ipa_get_view_name_done(struct tevent_req *req)
}
goto done;
}
- }
- ret = sysdb_invalidate_overrides(
+ ret = sysdb_transaction_commit(
ctx->sd_ctx->be_ctx->domain->sysdb);
- if (ret != EOK) {
- DEBUG(SSSDBG_OP_FAILURE,
- "sysdb_invalidate_overrides failed.\n");
- sret = sysdb_transaction_cancel(
- ctx->sd_ctx->be_ctx->domain->sysdb);
- if (sret != EOK) {
- DEBUG(SSSDBG_OP_FAILURE, "sysdb_transaction_cancel failed.\n");
+ if (ret != EOK) {
+ DEBUG(SSSDBG_OP_FAILURE,
+ "sysdb_transaction_commit failed.\n");
goto done;
}
- goto done;
+
+ /* TODO: start referesh task */
}
- ret = sysdb_transaction_commit(ctx->sd_ctx->be_ctx->domain->sysdb);
+ ret = sysdb_update_view_name(ctx->sd_ctx->be_ctx->domain->sysdb,
+ view_name);
if (ret != EOK) {
- DEBUG(SSSDBG_OP_FAILURE, "sysdb_transaction_commit failed.\n");
- goto done;
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "Cannot add/update view name to sysdb.\n");
+ } else {
+ talloc_free(ctx->sd_ctx->id_ctx->view_name);
+ ctx->sd_ctx->id_ctx->view_name = talloc_strdup(
+ ctx->sd_ctx->id_ctx,
+ view_name);
+ if (ctx->sd_ctx->id_ctx->view_name == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "Cannot copy view name.\n");
+ }
}
-
- /* TODO: start referesh task */
}
- ret = sysdb_update_view_name(ctx->sd_ctx->be_ctx->domain->sysdb,
- view_name);
- if (ret != EOK) {
- DEBUG(SSSDBG_CRIT_FAILURE,
- "Cannot add/update view name to sysdb.\n");
- } else {
- talloc_free(ctx->sd_ctx->id_ctx->view_name);
- ctx->sd_ctx->id_ctx->view_name = talloc_strdup(ctx->sd_ctx->id_ctx,
- view_name);
- if (ctx->sd_ctx->id_ctx->view_name == NULL) {
- DEBUG(SSSDBG_CRIT_FAILURE, "Cannot copy view name.\n");
+ if (!ctx->sd_ctx->view_read_at_init) {
+ /* refresh view data of all domains at startup */
+ ret = sysdb_master_domain_update(ctx->sd_ctx->be_ctx->domain);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_OP_FAILURE,
+ "sysdb_master_domain_update failed.\n");
+ goto done;
+ }
+
+ ret = sysdb_update_subdomains(ctx->sd_ctx->be_ctx->domain);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_OP_FAILURE, "sysdb_update_subdomains failed.\n");
+ goto done;
}
}
- /* TODO: only needed if view changed */
- ret = sysdb_master_domain_update(ctx->sd_ctx->be_ctx->domain);
- if (ret != EOK) {
- DEBUG(SSSDBG_OP_FAILURE, "sysdb_master_domain_update failed.\n");
- goto done;
- }
+ ctx->sd_ctx->view_read_at_init = true;
- ret = sysdb_update_subdomains(ctx->sd_ctx->be_ctx->domain);
- if (ret != EOK) {
- DEBUG(SSSDBG_OP_FAILURE, "sysdb_update_subdomains failed.\n");
- goto done;
- }
}
ret = ipa_check_master(ctx);
--
1.9.3