From be2c14a6c751da319eeb4af36eeb5dea4c821acf Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 14 Mar 2012 22:34:27 +0000
Subject: [PATCH] Initial fix for OPENDJ-249: dsreplication disable --disableAll error removing contents of "cn=admin data"

---
 opends/src/ads/org/opends/admin/ads/ADSContext.java                             |   34 +++++++++++++++++++++++++---------
 opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java            |    2 +-
 opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliMain.java |   13 +------------
 3 files changed, 27 insertions(+), 22 deletions(-)

diff --git a/opends/src/ads/org/opends/admin/ads/ADSContext.java b/opends/src/ads/org/opends/admin/ads/ADSContext.java
index a1e3052..83d0563 100644
--- a/opends/src/ads/org/opends/admin/ads/ADSContext.java
+++ b/opends/src/ads/org/opends/admin/ads/ADSContext.java
@@ -1187,7 +1187,12 @@
   {
     // Add the administration suffix
     createAdministrationSuffix(backendName);
+    createAdminDataContainers();
+  }
 
+  // Create container entries.
+  private void createAdminDataContainers() throws ADSContextException
+  {
     // Create the DIT below the administration suffix
     if (!isExistingEntry(nameFromDN(getAdministrationSuffixDN())))
     {
@@ -1228,16 +1233,26 @@
     }
   }
 
+
+
   /**
    * Removes the administration data.
-   * @throws ADSContextException if something goes wrong.
+   *
+   * @param removeAdministrators
+   *          {@code true} if administrators should be removed. It may not be
+   *          possible to remove administrators if the operation is being
+   *          performed by one of the administrators because it will cause the
+   *          administrator to be disconnected.
+   * @throws ADSContextException
+   *           if something goes wrong.
    */
-  public void removeAdminData() throws ADSContextException
+  public void removeAdminData(boolean removeAdministrators)
+      throws ADSContextException
   {
     String[] dns = {getServerContainerDN(),
         getServerGroupContainerDN(),
         getInstanceKeysContainerDN(),
-        getAdministratorContainerDN()};
+        removeAdministrators ? getAdministratorContainerDN() : null };
     try
     {
       Control[] controls = new Control[] { new SubtreeDeleteControl() };
@@ -1246,10 +1261,13 @@
       {
         for (String dn : dns)
         {
-          LdapName ldapName = nameFromDN(dn);
-          if (isExistingEntry(ldapName))
+          if (dn != null)
           {
-            tmpContext.destroySubcontext(dn);
+            LdapName ldapName = nameFromDN(dn);
+            if (isExistingEntry(ldapName))
+            {
+              tmpContext.destroySubcontext(dn);
+            }
           }
         }
       }
@@ -1267,9 +1285,7 @@
         }
       }
       // Recreate the container entries:
-      createContainerEntry(getServerContainerDN());
-      createContainerEntry(getServerGroupContainerDN());
-      createContainerEntry(getInstanceKeysContainerDN());
+      createAdminDataContainers();
     }
     catch(NamingException x)
     {
diff --git a/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java b/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
index 8981696..2b242f8 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
@@ -1643,7 +1643,7 @@
         ADSContext adsContext = new ADSContext(ctx);
         if (createdRemoteAds)
         {
-          adsContext.removeAdminData();
+          adsContext.removeAdminData(true);
         }
         else
         {
diff --git a/opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliMain.java b/opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliMain.java
index dd7d29b..2d25f5f 100644
--- a/opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliMain.java
+++ b/opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliMain.java
@@ -7005,18 +7005,7 @@
         // Delete all contents from ADSContext.
         printProgress(formatter.getFormattedWithPoints(
             INFO_REPLICATION_REMOVE_ADS_CONTENTS.get()));
-        adsCtx.removeAdminData();
-        String adminBackendName = null;
-        for (ReplicaDescriptor replica : server.getReplicas())
-        {
-          if (Utils.areDnsEqual(ADSContext.getAdministrationSuffixDN(),
-              replica.getSuffix().getDN()))
-          {
-            adminBackendName = replica.getBackendName();
-            break;
-          }
-        }
-        adsCtx.createAdminData(adminBackendName);
+        adsCtx.removeAdminData(false /* avoid self-disconnect */);
         printProgress(formatter.getFormattedDone());
         printlnProgress();
       }

--
Gitblit v1.10.0