Here it is again

On 10/12/2015 01:17 PM, Ludwig Krispenz wrote:


On 10/12/2015 12:44 PM, Martin Basti wrote:


On 23.07.2015 10:46, Ludwig Krispenz wrote:
The attached patch moves the cleaning of the RUV into the topology plugin.

I encountered a problem when removing a replica, which disconnects the topology, but it was fixed with my WIP for #5072.

I want to keep these issues separate, so please review and test the patch and let me know about issues found

Ludwig



Is this patch still valid and pending review?
it should be still valid, waiting for review, wanted to rebase after topology/promotion patches have been checked in and resend




>From 25548f31129c1d5887534a7c7591eb7b18f464cd Mon Sep 17 00:00:00 2001
From: Ludwig Krispenz <lkris...@redhat.com>
Date: Thu, 22 Oct 2015 15:07:13 +0200
Subject: [PATCH] handle cleaning of RUV in the topology plugin

After removing a server the replicaid needs to be cleared in the ruv entry and
in the changelog.
This was triggere by initiating a cleanallruv task in "ipa-replica-manage del",
but the removal of a master already triggers a cleanup of segments and replication
agreement by the topology plugin, so this could be handled by the plugin as well.
---
 daemons/ipa-slapi-plugins/topology/topology.h      |  1 +
 daemons/ipa-slapi-plugins/topology/topology_post.c |  1 +
 daemons/ipa-slapi-plugins/topology/topology_util.c | 92 ++++++++++++++++++++++
 install/tools/ipa-replica-manage                   |  7 +-
 4 files changed, 95 insertions(+), 6 deletions(-)

diff --git a/daemons/ipa-slapi-plugins/topology/topology.h b/daemons/ipa-slapi-plugins/topology/topology.h
index 1332c7bc76e4f4b091cbb691c8b61d8d9fee5d83..fea8281ac5f0865aca4052f6139e4384f5665b87 100644
--- a/daemons/ipa-slapi-plugins/topology/topology.h
+++ b/daemons/ipa-slapi-plugins/topology/topology.h
@@ -286,6 +286,7 @@ void ipa_topo_util_disable_repl_for_principal(char *repl_root, char *principal);
 void ipa_topo_util_add_host(Slapi_Entry *hostentry);
 void ipa_topo_util_delete_host(Slapi_Entry *hostentry);
 void ipa_topo_util_update_host(Slapi_Entry *hostentry, LDAPMod **mods);
+void ipa_topo_util_cleanruv(Slapi_Entry *hostentry);
 void ipa_topo_util_disable_repl_from_host(char *repl_root, char *delhost);
 void ipa_topo_util_delete_segments_for_host(char *repl_root, char *delhost);
 
diff --git a/daemons/ipa-slapi-plugins/topology/topology_post.c b/daemons/ipa-slapi-plugins/topology/topology_post.c
index c20de3cbe27c022a48da298d913ab795c883e954..5ac029a86a2f8ffbda895c5fe2a1af4c45152832 100644
--- a/daemons/ipa-slapi-plugins/topology/topology_post.c
+++ b/daemons/ipa-slapi-plugins/topology/topology_post.c
@@ -276,6 +276,7 @@ ipa_topo_post_del(Slapi_PBlock *pb)
          */
         ipa_topo_util_delete_host(del_entry);
         ipa_topo_cfg_host_del(del_entry);
+        ipa_topo_util_cleanruv(del_entry);
         break;
     case TOPO_IGNORE_ENTRY:
         break;
diff --git a/daemons/ipa-slapi-plugins/topology/topology_util.c b/daemons/ipa-slapi-plugins/topology/topology_util.c
index 26f569c5186688c5336bee077efbf2fc1dddbfee..1e4a67558d5c9d47dcaae6d2633ca5dd9692ccf6 100644
--- a/daemons/ipa-slapi-plugins/topology/topology_util.c
+++ b/daemons/ipa-slapi-plugins/topology/topology_util.c
@@ -1779,3 +1779,95 @@ ipa_topo_util_is_tombstone_op(Slapi_PBlock *pb)
     slapi_pblock_get(pb, SLAPI_OPERATION, &op);
     return slapi_operation_is_flag_set(op, SLAPI_OP_FLAG_TOMBSTONE_ENTRY);
 }
+int
+ipa_topo_util_cleanruv_task(char *repl_root, int replicaID)
+{
+    Slapi_Entry *e = NULL;
+    Slapi_PBlock *pb;
+    char *dn = NULL;
+    char *repl_rid;
+    Slapi_DN *sdn = NULL;
+    int ret = 0;
+    dn = slapi_ch_smprintf("cn=clean %d,cn=cleanallruv,cn=tasks,cn=config", replicaID);
+    if (dn  == NULL) return -1;
+    sdn = slapi_sdn_new_normdn_byref(dn);
+
+    e = slapi_entry_alloc();
+    /* the entry now owns the dup'd dn */
+    slapi_entry_init_ext(e, sdn, NULL); /* sdn is copied into e */
+    slapi_sdn_free(&sdn);
+
+    slapi_entry_add_string(e, SLAPI_ATTR_OBJECTCLASS, "extensibleobject");
+    slapi_entry_add_string(e, "replica-base-dn",repl_root);
+    repl_rid = slapi_ch_smprintf("%d",replicaID);
+    slapi_entry_add_string(e, "replica-id",repl_rid);
+    slapi_entry_add_string(e, "replica-force-cleaning", "yes");
+
+    pb = slapi_pblock_new();
+    slapi_pblock_init(pb);
+
+    /* e will be consumed by slapi_add_internal() */
+    slapi_add_entry_internal_set_pb(pb, e, NULL, ipa_topo_get_plugin_id(), 0);
+    slapi_add_internal_pb(pb);
+    slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &ret);
+    slapi_pblock_destroy(pb);
+    slapi_ch_free_string(&repl_rid);
+
+    return ret;
+
+}
+
+void
+ipa_topo_util_cleanruv_element(char *repl_root, char *hostname)
+{
+    Slapi_PBlock *pb = NULL;
+    char *filter = "(&(objectclass=nstombstone)(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff))";
+    char **ruv_ele = NULL;
+    int ret;
+    Slapi_Entry **entries = NULL;
+
+    /* find ruv object */
+    pb = slapi_pblock_new();
+    slapi_search_internal_set_pb(pb, repl_root, LDAP_SCOPE_SUB,
+                                 filter, NULL, 0, NULL, NULL,
+                                 ipa_topo_get_plugin_id(), 0);
+    slapi_search_internal_pb(pb);
+    slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &ret);
+    if (ret != 0) {
+        slapi_log_error(SLAPI_LOG_FATAL, IPA_TOPO_PLUGIN_SUBSYSTEM,
+                            "ipa_topo_util_cleanruv: no RUV entry found\n");
+    } else {
+        slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES, &entries);
+        if (NULL == entries || NULL == entries[0]) {
+            slapi_log_error(SLAPI_LOG_PLUGIN, IPA_TOPO_PLUGIN_SUBSYSTEM,
+                            "ipa_topo_util_cleanruv: no RUV entry found\n");
+        } else {
+            ruv_ele = slapi_entry_attr_get_charray(entries[0], "nsds50ruv");
+            int i = 0;
+            int rid = 0;
+            while (ruv_ele[i]) {
+                if (strstr(ruv_ele[i], hostname)) {
+                    rid = atoi(ruv_ele[i]+strlen("{replica "));
+                    ipa_topo_util_cleanruv_task(repl_root,rid);
+                    break;
+                }
+                i++;
+            }
+        }
+    }
+}
+
+void
+ipa_topo_util_cleanruv(Slapi_Entry *del_entry)
+{
+    char* delhost = NULL;
+    char **shared_root = ipa_topo_get_plugin_replica_root();
+    int i = 0;
+
+    delhost = slapi_entry_attr_get_charptr(del_entry,"cn");
+
+    while (shared_root[i]) {
+        ipa_topo_util_cleanruv_element(shared_root[i], delhost);
+        i++;
+    }
+}
diff --git a/install/tools/ipa-replica-manage b/install/tools/ipa-replica-manage
index 845c330318129d7a130073614fdf846f7659f430..118a376ed874912b61b22bd9c877973931d8d0ed 100755
--- a/install/tools/ipa-replica-manage
+++ b/install/tools/ipa-replica-manage
@@ -797,12 +797,7 @@ def del_master_managed(realm, hostname, options):
             break
         i += 1
 
-    # Clean RUV
-    if rid is not None:
-        try:
-            thisrepl.cleanallruv(rid)
-        except KeyboardInterrupt:
-            print("Wait for task interrupted. It will continue to run in the background")
+    # Clean RUV is handled by the topolgy plugin
 
     # 8. And clean up the removed replica DNS entries if any.
     cleanup_server_dns_entries(realm, hostname, thisrepl.suffix, options)
-- 
2.4.3

-- 
Manage your subscription for the Freeipa-devel mailing list:
https://www.redhat.com/mailman/listinfo/freeipa-devel
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code

Reply via email to