From 439544d24d842c19a0792f2612b5b088d992fc65 Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Tue, 25 Aug 2009 08:39:19 +0000
Subject: [PATCH] Fix 4184 ECL: lastExternalChangelogCookie contains info about private naming contexts

---
 opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java              |   21 +++++--
 opends/src/server/org/opends/server/replication/server/ReplicationServer.java                      |   28 +++++++++
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java |   56 +++++++++++-------
 opends/src/server/org/opends/server/replication/server/ExternalChangeLogSessionImpl.java           |   28 ---------
 opends/src/server/org/opends/server/replication/common/ExternalChangeLogSession.java               |    6 --
 5 files changed, 76 insertions(+), 63 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/common/ExternalChangeLogSession.java b/opends/src/server/org/opends/server/replication/common/ExternalChangeLogSession.java
index ca13e5a..3cf86f5 100644
--- a/opends/src/server/org/opends/server/replication/common/ExternalChangeLogSession.java
+++ b/opends/src/server/org/opends/server/replication/common/ExternalChangeLogSession.java
@@ -50,10 +50,4 @@
   public abstract void close()
   throws DirectoryException;
 
-  /**
-   * Returns the last (newest) cookie value.
-   * @return the last cookie value.
-   */
-  public abstract MultiDomainServerState getLastCookie();
-
 }
diff --git a/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java b/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java
index 64cbf3e..8bf4b39 100644
--- a/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java
+++ b/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java
@@ -27,6 +27,7 @@
 
 package org.opends.server.replication.common;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -39,7 +40,8 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.SearchOperation;
-import org.opends.server.replication.server.ExternalChangeLogSessionImpl;
+import org.opends.server.replication.plugin.MultimasterReplication;
+import org.opends.server.replication.server.ReplicationServer;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.AttributeValues;
 import org.opends.server.types.ByteString;
@@ -48,6 +50,7 @@
 import org.opends.server.types.InitializationException;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.VirtualAttributeRule;
+import org.opends.server.util.ServerConstants;
 import org.opends.server.workflowelement.externalchangelog.ECLWorkflowElement;
 
 /**
@@ -133,15 +136,21 @@
       DirectoryServer.getWorkflowElement("EXTERNAL CHANGE LOG");
       if (eclwe!=null)
       {
-        ExternalChangeLogSessionImpl eclsession =
-          new ExternalChangeLogSessionImpl(eclwe.getReplicationServer());
+        // Set a list of excluded domains (also exclude 'cn=changelog' itself)
+        ArrayList<String> excludedDomains =
+          MultimasterReplication.getPrivateDomains();
+        if (!excludedDomains.contains(
+            ServerConstants.DN_EXTERNAL_CHANGELOG_ROOT))
+          excludedDomains.add(ServerConstants.DN_EXTERNAL_CHANGELOG_ROOT);
 
-        String lastCookie = eclsession.getLastCookie().toString();
+        ReplicationServer rs = eclwe.getReplicationServer();
+        MultiDomainServerState lastCookie =
+          rs.getLastECLCookie(excludedDomains);
 
         AttributeValue value =
           AttributeValues.create(
-              ByteString.valueOf(lastCookie),
-              ByteString.valueOf(lastCookie));
+              ByteString.valueOf(lastCookie.toString()),
+              ByteString.valueOf(lastCookie.toString()));
         values=Collections.singleton(value);
       }
       return values;
diff --git a/opends/src/server/org/opends/server/replication/server/ExternalChangeLogSessionImpl.java b/opends/src/server/org/opends/server/replication/server/ExternalChangeLogSessionImpl.java
index 2d3ec71..6dddacd 100644
--- a/opends/src/server/org/opends/server/replication/server/ExternalChangeLogSessionImpl.java
+++ b/opends/src/server/org/opends/server/replication/server/ExternalChangeLogSessionImpl.java
@@ -26,14 +26,11 @@
  */
 package org.opends.server.replication.server;
 
-import java.util.Iterator;
 
 import org.opends.server.replication.common.ExternalChangeLogSession;
-import org.opends.server.replication.common.MultiDomainServerState;
 import org.opends.server.replication.protocol.ECLUpdateMsg;
 import org.opends.server.replication.protocol.StartECLSessionMsg;
 import org.opends.server.types.DirectoryException;
-import org.opends.server.util.ServerConstants;
 
 /**
  * This interface defines a session used to search the external changelog
@@ -97,29 +94,4 @@
   {
     handler.getDomain().stopServer(handler);
   }
-
-  /**
-   * Returns the last (newest) cookie value.
-   * @return the last cookie value.
-   */
-  public MultiDomainServerState getLastCookie()
-  {
-    MultiDomainServerState result = new MultiDomainServerState();
-    // Initialize start state for  all running domains with empty state
-    Iterator<ReplicationServerDomain> rsdk = rs.getDomainIterator();
-    if (rsdk != null)
-    {
-      while (rsdk.hasNext())
-      {
-        // process a domain
-        ReplicationServerDomain rsd = rsdk.next();
-        if (rsd.getBaseDn().compareToIgnoreCase(
-            ServerConstants.DN_EXTERNAL_CHANGELOG_ROOT)==0)
-          continue;
-        result.update(rsd.getBaseDn(), rsd.getEligibleState(
-            rs.getEligibleCN()));
-      }
-    }
-    return result;
-  }
 }
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index 4c98bbe..c6c9263 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -1699,4 +1699,32 @@
     return new int[]{firstDraftCN, lastDraftCN};
   }
 
+  /**
+   * Returns the last (newest) cookie value.
+   * @param excludedServiceIDs The list of serviceIDs excluded from ECL.
+   * @return the last cookie value.
+   */
+  public MultiDomainServerState getLastECLCookie(
+    ArrayList<String> excludedServiceIDs)
+  {
+    MultiDomainServerState result = new MultiDomainServerState();
+    // Initialize start state for  all running domains with empty state
+    Iterator<ReplicationServerDomain> rsdk = this.getDomainIterator();
+    if (rsdk != null)
+    {
+      while (rsdk.hasNext())
+      {
+        // process a domain
+        ReplicationServerDomain rsd = rsdk.next();
+
+        if ((excludedServiceIDs!=null)
+            && (excludedServiceIDs.contains(rsd.getBaseDn())))
+          continue;
+
+        result.update(rsd.getBaseDn(), rsd.getEligibleState(
+            getEligibleCN()));
+      }
+    }
+    return result;
+  }
 }
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java
index a2339f1..69f2d4a 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java
@@ -578,6 +578,20 @@
     debugInfo(tn, "Starting test");
     try
     {
+      ReplicationBroker server01 = openReplicationSession(
+          DN.decode(TEST_ROOT_DN_STRING), (short) 1201, 
+          100, replicationServerPort,
+          1000, true);
+
+      // create and publish 1 change on each suffix
+      long time = TimeThread.getTime();
+      int ts = 1;
+      ChangeNumber cn1 = new ChangeNumber(time, ts++, (short)1201);
+      DeleteMsg delMsg1 =
+        new DeleteMsg("o=" + tn + "1," + TEST_ROOT_DN_STRING, cn1, "ECLBasicMsg1uid");
+      server01.publish(delMsg1);
+      debugInfo(tn, "publishes:" + delMsg1);
+
       // Initialize a second test backend o=test2, in addtion to o=test
       // Configure replication on this backend
       // Add the root entry in the backend
@@ -628,9 +642,10 @@
         for (SearchResultEntry resultEntry : entries)
         {
           // Expect 
-          debugInfo(tn, "Entry returned=" + resultEntry.toLDIFString());
+          debugInfo(tn, "Entry returned when test2 is public =" +
+              resultEntry.toLDIFString());
         }
-      assertEquals(entries.size(),1, "Entries number returned by search");
+      assertEquals(entries.size(),2, "Entries number returned by search");
 
       //
       // Set the backend private and do again a search on ECL that should
@@ -651,27 +666,26 @@
           controls,
           null);
       
-      // Expect success but no entry returned
+      // Expect success and only entry from o=test returned
       assertEquals(searchOp.getResultCode(), ResultCode.SUCCESS,
           searchOp.getErrorMessage().toString() + searchOp.getAdditionalLogMessage());
       entries = searchOp.getSearchEntries();
       assertTrue(entries != null);
-      assertTrue(entries.size()==0);
+      assertTrue(entries.size()==1);
+      if (entries != null)
+        for (SearchResultEntry resultEntry : entries)
+        {
+          // Expect 
+          debugInfo(tn, "Entry returned when test2 is private ="
+              + resultEntry.toLDIFString());
+        }
 
       //
       // Test lastExternalChangelogCookie attribute of the ECL
-      //
-      /* FIXME: uncomment when fix available
-      ExternalChangeLogSessionImpl session = 
-        new ExternalChangeLogSessionImpl(replicationServer);
+      // (does only refer to non private backend)
       MultiDomainServerState expectedLastCookie =
-        new MultiDomainServerState("o=test:;");
-      MultiDomainServerState lastCookie = session.getLastCookie();
-      assertTrue(expectedLastCookie.equalsTo(lastCookie),
-          " ExpectedLastCookie=" + expectedLastCookie +
-          " lastCookie=" + lastCookie);
+        new MultiDomainServerState("o=test:"+cn1+";");
       assertLastCookieEquals(tn, expectedLastCookie);
-      */
       
       // Cleaning
       if (domain2 != null)
@@ -679,6 +693,8 @@
       if (replicationPlugin != null)
         DirectoryServer.deregisterSynchronizationProvider(replicationPlugin);
       removeTestBackend2(backend2);
+      
+      server01.stop();
     }
     catch(Exception e)
     {
@@ -990,14 +1006,8 @@
       //
       // Test lastExternalChangelogCookie attribute of the ECL
       //
-      ExternalChangeLogSessionImpl session = 
-        new ExternalChangeLogSessionImpl(replicationServer);
       MultiDomainServerState expectedLastCookie =
         new MultiDomainServerState("o=test:"+cn5+" "+cn9+";o=test2:"+cn3+" "+cn8+";");
-      MultiDomainServerState lastCookie = session.getLastCookie();
-      assertTrue(expectedLastCookie.equalsTo(lastCookie),
-          " ExpectedLastCookie=" + expectedLastCookie +
-          " lastCookie=" + lastCookie);
       assertLastCookieEquals(tn, expectedLastCookie);
       
       s1test.stop();
@@ -1745,21 +1755,21 @@
       s1 = new Socket("127.0.0.1", TestCaseUtils.getServerLdapPort());
       org.opends.server.tools.LDAPReader r1 = new org.opends.server.tools.LDAPReader(s1);
       LDAPWriter w1 = new LDAPWriter(s1);
-      s1.setSoTimeout(5000);
+      s1.setSoTimeout(15000);
       bindAsManager(w1, r1);
 
       // Connects and bind
       s2 = new Socket("127.0.0.1", TestCaseUtils.getServerLdapPort());
       org.opends.server.tools.LDAPReader r2 = new org.opends.server.tools.LDAPReader(s2);
       LDAPWriter w2 = new LDAPWriter(s2);
-      s2.setSoTimeout(5000);
+      s2.setSoTimeout(15000);
       bindAsManager(w2, r2);
 
       // Connects and bind
       s3 = new Socket("127.0.0.1", TestCaseUtils.getServerLdapPort());
       org.opends.server.tools.LDAPReader r3 = new org.opends.server.tools.LDAPReader(s3);
       LDAPWriter w3 = new LDAPWriter(s3);
-      s3.setSoTimeout(5000);
+      s3.setSoTimeout(15000);
       bindAsManager(w3, r3);
 
       // Since we are going to be watching the post-response count, we need to

--
Gitblit v1.10.0