From 1c8b422d63f419d8c85a28b1f2276ac0f3e3632c Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Thu, 12 Jul 2007 15:41:32 +0000
Subject: [PATCH] Fix for 1895 Summary: Total update does not work with 3 servers that are also replication servers

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java |  247 ++++++++++++++++++++++++++++++++++++------------
 1 files changed, 183 insertions(+), 64 deletions(-)

diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java
index 2f6f0c8..dd84def 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/InitOnLineTest.java
@@ -45,7 +45,11 @@
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
+import java.net.ServerSocket;
 import java.util.ArrayList;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
 import java.util.UUID;
 
 import org.opends.server.TestCaseUtils;
@@ -103,7 +107,7 @@
  */
 
 public class InitOnLineTest extends ReplicationTestCase
-{
+ {
   /**
    * The tracer object for the debug logger
    */
@@ -124,17 +128,21 @@
   boolean ssShutdownRequested = false;
   protected String[] updatedEntries;
   boolean externalDS = false;
-  short server1ID = 1;
-  short server2ID = 2;
-  short server3ID = 3;
-  short changelog1ID = 12;
-  short changelog2ID = 13;
-  int changelogPort = 8989;
+  private static final short server1ID = 11;
+  private static final short server2ID = 21;
+  private static final short server3ID = 31;
+  private static final short changelog1ID = 1;
+  private static final short changelog2ID = 2;
+  private static final short changelog3ID = 3;
 
+  private static int[] replServerPort = new int[4];
+  
   private DN baseDn;
   ReplicationBroker server2 = null;
+  ReplicationBroker server3 = null;
   ReplicationServer changelog1 = null;
   ReplicationServer changelog2 = null;
+  ReplicationServer changelog3 = null;
   boolean emptyOldChanges = true;
   ReplicationDomain sd = null;
 
@@ -221,16 +229,6 @@
         "ds-task-initialize-domain-dn: dc=example,dc=com",
         "ds-task-initialize-replica-server-id: all");
 
-    // Change log
-    String changeLogStringDN = "cn=Changelog Server, " + synchroPluginStringDN;
-    String changeLogLdif = "dn: " + changeLogStringDN + "\n"
-    + "objectClass: top\n"
-    + "objectClass: ds-cfg-synchronization-changelog-server-config\n"
-    + "cn: Changelog Server\n" + "ds-cfg-changelog-port: 8990\n"
-    + "ds-cfg-changelog-server-id: 1\n"
-    + "ds-cfg-window-size: " + WINDOW_SIZE + "\n"
-    + "ds-cfg-changelog-max-queue-size: " + CHANGELOG_QUEUE_SIZE;
-    replServerEntry = TestCaseUtils.entryFromLdifString(changeLogLdif);
     replServerEntry = null;
 
   }
@@ -604,17 +602,20 @@
         "dn: dc=example,dc=com\n"
         + "objectClass: top\n"
         + "objectClass: domain\n"
+        + "dc: example\n"
         + "entryUUID: 21111111-1111-1111-1111-111111111111\n"
         + "\n",
           "dn: ou=People,dc=example,dc=com\n"
         + "objectClass: top\n"
         + "objectClass: organizationalUnit\n"
+        + "ou: People\n"
         + "entryUUID: 21111111-1111-1111-1111-111111111112\n"
         + "\n",
           "dn: cn=Fiona Jensen,ou=people,dc=example,dc=com\n"
         + "objectclass: top\n"
         + "objectclass: person\n"
         + "objectclass: organizationalPerson\n"
+        + "objectclass: inetOrgPerson\n"
         + "cn: Fiona Jensen\n"
         + "sn: Jensen\n"
         + "uid: fiona\n"
@@ -625,6 +626,7 @@
         + "objectclass: top\n"
         + "objectclass: person\n"
         + "objectclass: organizationalPerson\n"
+        + "objectclass: inetOrgPerson\n"
         + "cn: Robert Langman\n"
         + "sn: Langman\n"
         + "uid: robert\n"
@@ -738,25 +740,37 @@
    */
   private ReplicationServer createChangelogServer(short changelogId)
   {
+    SortedSet<String> servers = null;
+    servers = new TreeSet<String>();
     try
     {
-      if ((changelogId==changelog1ID)&&(changelog1!=null))
-        return changelog1;
-
-      if ((changelogId==changelog2ID)&&(changelog2!=null))
-        return changelog2;
-
+      if (changelogId==changelog1ID)
       {
-        int chPort = getChangelogPort(changelogId);
-
-        ReplServerFakeConfiguration conf =
-          new ReplServerFakeConfiguration(chPort, null, 0, changelogId, 0, 100,
-                                         null);
-        ReplicationServer replicationServer = new ReplicationServer(conf);
-        Thread.sleep(1000);
-
-        return replicationServer;
+        if (changelog1!=null)
+          return changelog1;
       }
+      else if (changelogId==changelog2ID)
+      {
+        if (changelog2!=null)
+          return changelog2;
+      }
+      else if (changelogId==changelog3ID)
+      {
+        if (changelog3!=null)
+          return changelog3;
+      }
+      servers.add("localhost:" + getChangelogPort(changelog1ID));
+      servers.add("localhost:" + getChangelogPort(changelog2ID));
+      servers.add("localhost:" + getChangelogPort(changelog3ID));
+
+      int chPort = getChangelogPort(changelogId);
+      ReplServerFakeConfiguration conf =
+        new ReplServerFakeConfiguration(chPort, null, 0, changelogId, 0, 100,
+            servers);
+      ReplicationServer replicationServer = new ReplicationServer(conf);
+      Thread.sleep(1000);
+
+      return replicationServer;
     }
     catch (Exception e)
     {
@@ -796,7 +810,6 @@
         DirectoryServer.getConfigHandler().addEntry(synchroServerEntry, null);
         assertNotNull(DirectoryServer.getConfigEntry(synchroServerEntry.getDN()),
         "Unable to add the synchronized server");
-        entryList.add(synchroServerEntry.getDN());
 
         sd = ReplicationDomain.retrievesReplicationDomain(baseDn);
 
@@ -820,14 +833,29 @@
 
   private int getChangelogPort(short changelogID)
   {
-    return (changelogPort+changelogID);
+    if (replServerPort[changelogID] == 0)
+    {
+      try
+      {
+        // Find  a free port for the replicationServer
+        ServerSocket socket = TestCaseUtils.bindFreePort();
+        replServerPort[changelogID] = socket.getLocalPort();
+        socket.close();
+      }
+      catch(Exception e)
+      {
+        fail("Cannot retrieve a free port for replication server."
+          + e.getMessage());
+      }
+    }
+    return replServerPort[changelogID];
   }
 
   /**
    * Tests the import side of the Initialize task
    */
   @Test(enabled=false)
-  public void InitializeImport() throws Exception
+  public void initializeImport() throws Exception
   {
     String testCase = "InitializeImport";
 
@@ -883,7 +911,7 @@
    * Tests the export side of the Initialize task
    */
   @Test(enabled=false)
-  public void InitializeExport() throws Exception
+  public void initializeExport() throws Exception
   {
     String testCase = "Replication/InitializeExport";
 
@@ -917,7 +945,7 @@
    * Tests the import side of the InitializeTarget task
    */
   @Test(enabled=false)
-  public void InitializeTargetExport() throws Exception
+  public void initializeTargetExport() throws Exception
   {
     String testCase = "Replication/InitializeTargetExport";
 
@@ -957,7 +985,7 @@
    * Tests the import side of the InitializeTarget task
    */
   @Test(enabled=false)
-  public void InitializeTargetExportAll() throws Exception
+  public void initializeTargetExportAll() throws Exception
   {
     String testCase = "Replication/InitializeTargetExportAll";
 
@@ -1001,7 +1029,7 @@
    * Tests the import side of the InitializeTarget task
    */
   @Test(enabled=false)
-  public void InitializeTargetImport() throws Exception
+  public void initializeTargetImport() throws Exception
   {
     String testCase = "InitializeTargetImport";
 
@@ -1042,7 +1070,7 @@
    * Tests the import side of the InitializeTarget task
    */
   @Test(enabled=false)
-  public void InitializeTargetConfigErrors() throws Exception
+  public void initializeTargetConfigErrors() throws Exception
   {
     String testCase = "InitializeTargetConfigErrors";
 
@@ -1096,7 +1124,7 @@
    * Tests the import side of the InitializeTarget task
    */
   @Test(enabled=false)
-  public void InitializeConfigErrors() throws Exception
+  public void initializeConfigErrors() throws Exception
   {
     String testCase = "InitializeConfigErrors";
 
@@ -1116,10 +1144,10 @@
           ",cn=Scheduled Tasks,cn=Tasks",
           "objectclass: top",
           "objectclass: ds-task",
-          "objectclass: ds-task-initialize",
+          "objectclass: ds-task-initialize-from-remote-replica",
           "ds-task-class-name: org.opends.server.tasks.InitializeTask",
           "ds-task-initialize-domain-dn: foo",
-          "ds-task-initialize-source: " + server2ID);
+          "ds-task-initialize-replica-server-id: " + server2ID);
       addTask(taskInit, ResultCode.INVALID_DN_SYNTAX,
           TaskMessages.MSGID_TASK_INITIALIZE_INVALID_DN);
 
@@ -1129,10 +1157,10 @@
           ",cn=Scheduled Tasks,cn=Tasks",
           "objectclass: top",
           "objectclass: ds-task",
-          "objectclass: ds-task-initialize",
+          "objectclass: ds-task-initialize-from-remote-replica",
           "ds-task-class-name: org.opends.server.tasks.InitializeTask",
           "ds-task-initialize-domain-dn: dc=foo",
-          "ds-task-initialize-source: " + server2ID);
+          "ds-task-initialize-replica-server-id: " + server2ID);
       addTask(taskInit, ResultCode.OTHER, MSGID_NO_MATCHING_DOMAIN);
 
       // Invalid Source
@@ -1141,10 +1169,10 @@
           ",cn=Scheduled Tasks,cn=Tasks",
           "objectclass: top",
           "objectclass: ds-task",
-          "objectclass: ds-task-initialize",
+          "objectclass: ds-task-initialize-from-remote-replica",
           "ds-task-class-name: org.opends.server.tasks.InitializeTask",
           "ds-task-initialize-domain-dn: " + baseDn,
-          "ds-task-initialize-source: -3");
+          "ds-task-initialize-replica-server-id: -3");
       addTask(taskInit, ResultCode.OTHER,
           MSGID_INVALID_IMPORT_SOURCE);
 
@@ -1162,21 +1190,101 @@
   }
 
   @Test(enabled=false)
-  public void InitializeTargetBroken() throws Exception
+  public void initializeTargetBroken() throws Exception
   {
     String testCase = "InitializeTargetBroken";
     fail(testCase + " NYI");
   }
 
   @Test(enabled=false)
-  public void InitializeBroken() throws Exception
+  public void initializeBroken() throws Exception
   {
     String testCase = "InitializeBroken";
     fail(testCase + " NYI");
   }
 
+  /*
+   * TestReplServerInfos tests that in a topology with more
+   * than one replication server, in each replication server
+   * is stored the list of LDAP servers connected to each
+   * replication server of the topology, thanks to the
+   * ReplServerInfoMessage(s) exchanged by the replication
+   * servers.
+   */
   @Test(enabled=false)
-  public void InitializeTargetExportMultiSS() throws Exception
+  public void testReplServerInfos() throws Exception
+  {
+    String testCase = "Replication/TestReplServerInfos";
+
+    log("Starting " + testCase);
+
+    // Create the Repl Servers
+    changelog1 = createChangelogServer(changelog1ID);
+    changelog2 = createChangelogServer(changelog2ID);
+    changelog3 = createChangelogServer(changelog3ID);
+
+    // Connects lDAP1 to replServer1
+    connectServer1ToChangelog(changelog1ID);
+
+    // Connects lDAP2 to replServer2
+    ReplicationBroker broker2 = 
+      openReplicationSession(DN.decode("dc=example,dc=com"),
+        server2ID, 100, getChangelogPort(changelog2ID), 1000, emptyOldChanges);
+
+    // Connects lDAP3 to replServer2
+    ReplicationBroker broker3 =
+      openReplicationSession(DN.decode("dc=example,dc=com"),
+        server3ID, 100, getChangelogPort(changelog2ID), 1000, emptyOldChanges);
+
+    // Check that the list of connected LDAP servers is correct
+    // in each replication servers
+    List<String> l1 = changelog1.getReplicationCache(baseDn).
+      getConnectedLDAPservers();
+    assertEquals(l1.size(), 1);
+    assertEquals(l1.get(0), String.valueOf(server1ID));
+    
+    List<String> l2;
+    l2 = changelog2.getReplicationCache(baseDn).getConnectedLDAPservers();
+    assertEquals(l2.size(), 2);
+    assertEquals(l2.get(0), String.valueOf(server3ID));
+    assertEquals(l2.get(1), String.valueOf(server2ID));
+        
+    List<String> l3;
+    l3 = changelog3.getReplicationCache(baseDn).getConnectedLDAPservers();
+    assertEquals(l3.size(), 0);
+
+    // Test updates
+    broker3.stop();
+    Thread.sleep(1000);
+    l2 = changelog2.getReplicationCache(baseDn).getConnectedLDAPservers();
+    assertEquals(l2.size(), 1);
+    assertEquals(l2.get(0), String.valueOf(server2ID));
+
+    broker3 = openReplicationSession(DN.decode("dc=example,dc=com"),
+        server3ID, 100, getChangelogPort(changelog2ID), 1000, emptyOldChanges);
+    broker2.stop();
+    Thread.sleep(1000);
+    l2 = changelog2.getReplicationCache(baseDn).getConnectedLDAPservers();
+    assertEquals(l2.size(), 1);
+    assertEquals(l2.get(0), String.valueOf(server3ID));
+
+    // TODO Test ReplicationCache.getDestinationServers method.
+
+    broker2.stop();
+    broker3.stop();
+
+    cleanEntries();
+
+    changelog3.shutdown();
+    changelog3 = null;
+    changelog2.shutdown();
+    changelog2 = null;
+    changelog1.shutdown();
+    changelog1 = null;
+  }
+  
+  @Test(enabled=false)
+  public void initializeTargetExportMultiSS() throws Exception
   {
     String testCase = "Replication/InitializeTargetExportMultiSS";
 
@@ -1222,17 +1330,20 @@
   }
 
   @Test(enabled=false)
-  public void InitializeExportMultiSS() throws Exception
+  public void initializeExportMultiSS() throws Exception
   {
     String testCase = "Replication/InitializeExportMultiSS";
     log("Starting "+testCase);
 
     // Create 2 changelogs
     changelog1 = createChangelogServer(changelog1ID);
-    Thread.sleep(3000);
+    Thread.sleep(1000);
 
     changelog2 = createChangelogServer(changelog2ID);
-    Thread.sleep(3000);
+    Thread.sleep(1000);
+
+    changelog3 = createChangelogServer(changelog3ID);
+    Thread.sleep(1000);
 
     // Connect DS to the replicationServer 1
     connectServer1ToChangelog(changelog1ID);
@@ -1240,7 +1351,7 @@
     // Put entries in DB
     addTestEntriesToDB();
 
-    // Connect a broker acting as server 2 to changelog2
+    // Connect a broker acting as server 2 to Repl Server 2
     if (server2 == null)
     {
       server2 = openReplicationSession(DN.decode("dc=example,dc=com"),
@@ -1248,6 +1359,14 @@
         1000, emptyOldChanges);
     }
 
+    // Connect a broker acting as server 3 to Repl Server 3
+    if (server3 == null)
+    {
+      server3 = openReplicationSession(DN.decode("dc=example,dc=com"),
+        server3ID, 100, getChangelogPort(changelog3ID),
+        1000, emptyOldChanges);
+    }
+
     Thread.sleep(3000);
 
     // S2 sends init request
@@ -1267,7 +1386,7 @@
   }
 
   @Test(enabled=false)
-  public void InitializeNoSource() throws Exception
+  public void initializeNoSource() throws Exception
   {
     String testCase = "InitializeNoSource";
     log("Starting "+testCase);
@@ -1317,7 +1436,7 @@
   }
 
   @Test(enabled=false)
-  public void InitializeTargetNoTarget() throws Exception
+  public void initializeTargetNoTarget() throws Exception
   {
     String testCase = "InitializeTargetNoTarget"  + baseDn;
     log("Starting "+testCase);
@@ -1336,10 +1455,10 @@
         ",cn=Scheduled Tasks,cn=Tasks",
         "objectclass: top",
         "objectclass: ds-task",
-        "objectclass: ds-task-initialize-target",
+        "objectclass: ds-task-initialize-remote-replica",
         "ds-task-class-name: org.opends.server.tasks.InitializeTargetTask",
-        "ds-task-initialize-target-domain-dn: "+baseDn,
-        "ds-task-initialize-target-scope: " + 10);
+        "ds-task-initialize-domain-dn: "+baseDn,
+        "ds-task-initialize-replica-server-id: " + 0);
 
     addTask(taskInit, ResultCode.SUCCESS, 0);
 
@@ -1355,32 +1474,32 @@
   }
 
   @Test(enabled=false)
-  public void InitializeStopped() throws Exception
+  public void initializeStopped() throws Exception
   {
     String testCase = "InitializeStopped";
     fail(testCase + " NYI");
   }
   @Test(enabled=false)
-  public void InitializeTargetStopped() throws Exception
+  public void initializeTargetStopped() throws Exception
   {
     String testCase = "InitializeTargetStopped";
     fail(testCase + " NYI");
   }
   @Test(enabled=false)
-  public void InitializeCompressed() throws Exception
+  public void initializeCompressed() throws Exception
   {
     String testCase = "InitializeStopped";
     fail(testCase + " NYI");
   }
   @Test(enabled=false)
-  public void InitializeTargetEncrypted() throws Exception
+  public void initializeTargetEncrypted() throws Exception
   {
     String testCase = "InitializeTargetCompressed";
     fail(testCase + " NYI");
   }
 
   @Test(enabled=false)
-  public void InitializeSimultaneous() throws Exception
+  public void initializeSimultaneous() throws Exception
   {
     String testCase = "InitializeSimultaneous";
 

--
Gitblit v1.10.0