From 83e17e3a3f12fca9aff4de972b38ba3bd17388e3 Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Wed, 16 Apr 2008 08:53:37 +0000
Subject: [PATCH] Fix for issue  3139 (dsreplication tool inefficient in relation to number of backends)

---
 opendj-sdk/opends/src/ads/org/opends/admin/ads/ServerDescriptor.java |  285 ++++++++++++++++++++++++++++++++------------------------
 1 files changed, 163 insertions(+), 122 deletions(-)

diff --git a/opendj-sdk/opends/src/ads/org/opends/admin/ads/ServerDescriptor.java b/opendj-sdk/opends/src/ads/org/opends/admin/ads/ServerDescriptor.java
index 9100d85..c954372 100644
--- a/opendj-sdk/opends/src/ads/org/opends/admin/ads/ServerDescriptor.java
+++ b/opendj-sdk/opends/src/ads/org/opends/admin/ads/ServerDescriptor.java
@@ -629,23 +629,26 @@
    * using the provided InitialLdapContext.
    * @param ctx the InitialLdapContext that will be used to read the
    * configuration of the server.
+   * @param filter the topology cache filter describing the information that
+   * must be retrieved.
    * @return a ServerDescriptor object that corresponds to the read
    * configuration.
    * @throws NamingException if a problem occurred reading the server
    * configuration.
    */
-  public static ServerDescriptor createStandalone(InitialLdapContext ctx)
+  public static ServerDescriptor createStandalone(InitialLdapContext ctx,
+      TopologyCacheFilter filter)
   throws NamingException
   {
     ServerDescriptor desc = new ServerDescriptor();
 
 
-    updateLdapConfiguration(desc, ctx);
-    updateJmxConfiguration(desc, ctx);
-    updateReplicas(desc, ctx);
-    updateReplication(desc, ctx);
-    updatePublicKeyCertificate(desc, ctx);
-    updateMiscellaneous(desc, ctx);
+    updateLdapConfiguration(desc, ctx, filter);
+    updateJmxConfiguration(desc, ctx, filter);
+    updateReplicas(desc, ctx, filter);
+    updateReplication(desc, ctx, filter);
+    updatePublicKeyCertificate(desc, ctx, filter);
+    updateMiscellaneous(desc, ctx, filter);
 
     desc.serverProperties.put(ServerProperty.HOST_NAME,
         ConnectionUtils.getHostName(ctx));
@@ -654,7 +657,8 @@
   }
 
   private static void updateLdapConfiguration(ServerDescriptor desc,
-      InitialLdapContext ctx) throws NamingException
+      InitialLdapContext ctx, TopologyCacheFilter cacheFilter)
+  throws NamingException
   {
     SearchControls ctls = new SearchControls();
     ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
@@ -712,7 +716,8 @@
   }
 
   private static void updateJmxConfiguration(ServerDescriptor desc,
-      InitialLdapContext ctx) throws NamingException
+      InitialLdapContext ctx, TopologyCacheFilter cacheFilter)
+  throws NamingException
   {
     SearchControls ctls = new SearchControls();
     ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
@@ -764,8 +769,13 @@
   }
 
   private static void updateReplicas(ServerDescriptor desc,
-      InitialLdapContext ctx) throws NamingException
+      InitialLdapContext ctx, TopologyCacheFilter cacheFilter)
+  throws NamingException
   {
+    if (!cacheFilter.searchBaseDNInformation())
+    {
+      return;
+    }
     SearchControls ctls = new SearchControls();
     ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
     ctls.setReturningAttributes(
@@ -788,42 +798,65 @@
       {
         Set<String> baseDns = getValues(sr, "ds-cfg-base-dn");
 
-        Set<String> entries = getBaseDNEntryCount(ctx, id);
+        Set<String> entries;
+        if (cacheFilter.searchMonitoringInformation())
+        {
+          entries = getBaseDNEntryCount(ctx, id);
+        }
+        else
+        {
+          entries = new HashSet<String>();
+        }
 
         Set<ReplicaDescriptor> replicas = desc.getReplicas();
         for (String baseDn : baseDns)
         {
-          SuffixDescriptor suffix = new SuffixDescriptor();
-          suffix.setDN(baseDn);
-          ReplicaDescriptor replica = new ReplicaDescriptor();
-          replica.setServer(desc);
-          replicas.add(replica);
-          HashSet<ReplicaDescriptor> r = new HashSet<ReplicaDescriptor>();
-          r.add(replica);
-          suffix.setReplicas(r);
-          replica.setSuffix(suffix);
-          int nEntries = -1;
-          for (String s : entries)
+          boolean addReplica = cacheFilter.searchAllBaseDNs();
+          if (!addReplica)
           {
-            int index = s.indexOf(" ");
-            if (index != -1)
+            for (String dn : cacheFilter.getBaseDNsToSearch())
             {
-              String dn = s.substring(index + 1);
-              if (Utils.areDnsEqual(baseDn, dn))
+              addReplica = Utils.areDnsEqual(dn, baseDn);
+              if (addReplica)
               {
-                try
-                {
-                  nEntries = Integer.parseInt(s.substring(0, index));
-                }
-                catch (Throwable t)
-                {
-                  /* Ignore */
-                }
                 break;
               }
             }
           }
-          replica.setEntries(nEntries);
+          if(addReplica)
+          {
+            SuffixDescriptor suffix = new SuffixDescriptor();
+            suffix.setDN(baseDn);
+            ReplicaDescriptor replica = new ReplicaDescriptor();
+            replica.setServer(desc);
+            replicas.add(replica);
+            HashSet<ReplicaDescriptor> r = new HashSet<ReplicaDescriptor>();
+            r.add(replica);
+            suffix.setReplicas(r);
+            replica.setSuffix(suffix);
+            int nEntries = -1;
+            for (String s : entries)
+            {
+              int index = s.indexOf(" ");
+              if (index != -1)
+              {
+                String dn = s.substring(index + 1);
+                if (Utils.areDnsEqual(baseDn, dn))
+                {
+                  try
+                  {
+                    nEntries = Integer.parseInt(s.substring(0, index));
+                  }
+                  catch (Throwable t)
+                  {
+                    /* Ignore */
+                  }
+                  break;
+                }
+              }
+            }
+            replica.setEntries(nEntries);
+          }
         }
         desc.setReplicas(replicas);
       }
@@ -831,7 +864,8 @@
   }
 
   private static void updateReplication(ServerDescriptor desc,
-      InitialLdapContext ctx) throws NamingException
+      InitialLdapContext ctx, TopologyCacheFilter cacheFilter)
+  throws NamingException
   {
     boolean replicationEnabled = false;
     boolean oneDomainReplicated = false;
@@ -868,56 +902,59 @@
     desc.serverProperties.put(ServerProperty.IS_REPLICATION_ENABLED,
         replicationEnabled ? Boolean.TRUE : Boolean.FALSE);
 
-    ctls = new SearchControls();
-    ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
-    ctls.setReturningAttributes(
-        new String[] {
-            "ds-cfg-base-dn",
-            "ds-cfg-replication-server",
-            "ds-cfg-server-id"
-        });
-    filter = "(objectclass=ds-cfg-replication-domain)";
+    if (cacheFilter.searchBaseDNInformation())
+    {
+      ctls = new SearchControls();
+      ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+      ctls.setReturningAttributes(
+          new String[] {
+              "ds-cfg-base-dn",
+              "ds-cfg-replication-server",
+              "ds-cfg-server-id"
+          });
+      filter = "(objectclass=ds-cfg-replication-domain)";
 
-    jndiName = new LdapName(
+      jndiName = new LdapName(
       "cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config");
 
-    try
-    {
-      NamingEnumeration syncProviders = ctx.search(jndiName, filter, ctls);
-
-      while(syncProviders.hasMore())
+      try
       {
-        SearchResult sr = (SearchResult)syncProviders.next();
+        NamingEnumeration syncProviders = ctx.search(jndiName, filter, ctls);
 
-        int id = Integer.parseInt(
-            getFirstValue(sr, "ds-cfg-server-id"));
-        Set<String> replicationServers = getValues(sr,
-            "ds-cfg-replication-server");
-        Set<String> dns = getValues(sr, "ds-cfg-base-dn");
-        oneDomainReplicated = dns.size() > 0;
-        for (String dn : dns)
+        while(syncProviders.hasMore())
         {
-          for (ReplicaDescriptor replica : desc.getReplicas())
+          SearchResult sr = (SearchResult)syncProviders.next();
+
+          int id = Integer.parseInt(
+              getFirstValue(sr, "ds-cfg-server-id"));
+          Set<String> replicationServers = getValues(sr,
+          "ds-cfg-replication-server");
+          Set<String> dns = getValues(sr, "ds-cfg-base-dn");
+          oneDomainReplicated = dns.size() > 0;
+          for (String dn : dns)
           {
-            if (areDnsEqual(replica.getSuffix().getDN(), dn))
+            for (ReplicaDescriptor replica : desc.getReplicas())
             {
-              replica.setReplicationId(id);
-              // Keep the values of the replication servers in lower case
-              // to make use of Sets as String simpler.
-              LinkedHashSet<String> repServers = new LinkedHashSet<String>();
-              for (String s: replicationServers)
+              if (areDnsEqual(replica.getSuffix().getDN(), dn))
               {
-                repServers.add(s.toLowerCase());
+                replica.setReplicationId(id);
+                // Keep the values of the replication servers in lower case
+                // to make use of Sets as String simpler.
+                LinkedHashSet<String> repServers = new LinkedHashSet<String>();
+                for (String s: replicationServers)
+                {
+                  repServers.add(s.toLowerCase());
+                }
+                replica.setReplicationServers(repServers);
               }
-              replica.setReplicationServers(repServers);
             }
           }
         }
       }
-    }
-    catch (NameNotFoundException nse)
-    {
-      /* ignore */
+      catch (NameNotFoundException nse)
+      {
+        /* ignore */
+      }
     }
 
     ctls = new SearchControls();
@@ -967,66 +1004,69 @@
       /* ignore */
     }
 
-    ctls = new SearchControls();
-    ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
-    ctls.setReturningAttributes(
-    new String[] {
-      "approx-older-change-not-synchronized-millis", "missing-changes",
-      "base-dn", "server-id"
-    });
-    filter = "(missing-changes=*)";
-
-    jndiName = new LdapName("cn=monitor");
-
-    if (oneDomainReplicated)
+    if (cacheFilter.searchMonitoringInformation())
     {
-      try
+      ctls = new SearchControls();
+      ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
+      ctls.setReturningAttributes(
+          new String[] {
+              "approx-older-change-not-synchronized-millis", "missing-changes",
+              "base-dn", "server-id"
+          });
+      filter = "(missing-changes=*)";
+
+      jndiName = new LdapName("cn=monitor");
+
+      if (oneDomainReplicated)
       {
-        NamingEnumeration monitorEntries = ctx.search(jndiName, filter, ctls);
-
-        while(monitorEntries.hasMore())
+        try
         {
-          SearchResult sr = (SearchResult)monitorEntries.next();
+          NamingEnumeration monitorEntries = ctx.search(jndiName, filter, ctls);
 
-          String dn = getFirstValue(sr, "base-dn");
-          int replicaId = -1;
-          try
+          while(monitorEntries.hasMore())
           {
-            replicaId = new Integer(getFirstValue(sr, "server-id"));
-          }
-          catch (Throwable t)
-          {
-          }
+            SearchResult sr = (SearchResult)monitorEntries.next();
 
-          for (ReplicaDescriptor replica: desc.getReplicas())
-          {
-            if (Utils.areDnsEqual(dn, replica.getSuffix().getDN()) &&
-                replica.isReplicated() &&
-                (replica.getReplicationId() == replicaId))
+            String dn = getFirstValue(sr, "base-dn");
+            int replicaId = -1;
+            try
             {
-              try
+              replicaId = new Integer(getFirstValue(sr, "server-id"));
+            }
+            catch (Throwable t)
+            {
+            }
+
+            for (ReplicaDescriptor replica: desc.getReplicas())
+            {
+              if (Utils.areDnsEqual(dn, replica.getSuffix().getDN()) &&
+                  replica.isReplicated() &&
+                  (replica.getReplicationId() == replicaId))
               {
-                replica.setAgeOfOldestMissingChange(
-                    new Long(getFirstValue(sr,
-                        "approx-older-change-not-synchronized-millis")));
-              }
-              catch (Throwable t)
-              {
-              }
-              try
-              {
-                replica.setMissingChanges(
-                    new Integer(getFirstValue(sr, "missing-changes")));
-              }
-              catch (Throwable t)
-              {
+                try
+                {
+                  replica.setAgeOfOldestMissingChange(
+                      new Long(getFirstValue(sr,
+                      "approx-older-change-not-synchronized-millis")));
+                }
+                catch (Throwable t)
+                {
+                }
+                try
+                {
+                  replica.setMissingChanges(
+                      new Integer(getFirstValue(sr, "missing-changes")));
+                }
+                catch (Throwable t)
+                {
+                }
               }
             }
           }
         }
-      }
-      catch (NameNotFoundException nse)
-      {
+        catch (NameNotFoundException nse)
+        {
+        }
       }
     }
 
@@ -1069,7 +1109,7 @@
    instance.
    */
   private static void updatePublicKeyCertificate(ServerDescriptor desc,
-      InitialLdapContext ctx) throws NamingException
+      InitialLdapContext ctx, TopologyCacheFilter filter) throws NamingException
   {
     /* TODO: this DN is declared in some core constants file. Create a constants
        file for the installer and import it into the core. */
@@ -1114,7 +1154,8 @@
   }
 
   private static void updateMiscellaneous(ServerDescriptor desc,
-      InitialLdapContext ctx) throws NamingException
+      InitialLdapContext ctx, TopologyCacheFilter cacheFilter)
+  throws NamingException
   {
     SearchControls ctls = new SearchControls();
     ctls.setSearchScope(SearchControls.OBJECT_SCOPE);

--
Gitblit v1.10.0