From b3c070bb2107aec085fa3f16ba1c118a71e30a7b Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Wed, 13 Feb 2008 09:14:39 +0000
Subject: [PATCH] Fix 2911 - dsreplication pre/post-external initialisation fails to clear all the changelogs

---
 opends/src/server/org/opends/server/core/DirectoryServer.java                                                     |    2 ++
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ReplicationServerFailoverTest.java |    1 +
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/DependencyTest.java                       |    4 ++++
 opends/src/server/org/opends/server/api/SynchronizationProvider.java                                              |   11 +++++++++++
 opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java                                |   27 +++++++++++++++++++++++----
 opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java                                     |    4 +++-
 6 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/opends/src/server/org/opends/server/api/SynchronizationProvider.java b/opends/src/server/org/opends/server/api/SynchronizationProvider.java
index 1ba42bb..abcc576 100644
--- a/opends/src/server/org/opends/server/api/SynchronizationProvider.java
+++ b/opends/src/server/org/opends/server/api/SynchronizationProvider.java
@@ -117,6 +117,17 @@
 
 
   /**
+   * Performs any necessary final initialization processing for this
+   * synchronization provider.
+   * This will be called just after the provider has been
+   * registered with the server but before it has been unloaded.
+   */
+  public void completeSynchronizationProvider()
+  {
+    // No implementation is required by default.
+  }
+
+  /**
    * Performs any necessary finalization for this synchronization
    * provider.  This will be called just after the provider has been
    * deregistered with the server but before it has been unloaded.
diff --git a/opends/src/server/org/opends/server/core/DirectoryServer.java b/opends/src/server/org/opends/server/core/DirectoryServer.java
index 34cf5e1..51f9b3c 100644
--- a/opends/src/server/org/opends/server/core/DirectoryServer.java
+++ b/opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -7640,6 +7640,8 @@
       SynchronizationProvider<SynchronizationProviderCfg> provider)
   {
     directoryServer.synchronizationProviders.add(provider);
+
+    provider.completeSynchronizationProvider();
   }
 
 
diff --git a/opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java b/opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java
index cc6afcb..81798bf 100644
--- a/opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java
+++ b/opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java
@@ -112,6 +112,8 @@
    */
   private static int replayThreadNumber = 10;
 
+  private boolean isRegistered = false;
+
   /**
    * Finds the domain for a given DN.
    *
@@ -200,7 +202,6 @@
     }
 
     domains.put(domain.getBaseDN(), domain);
-    domain.start();
     return domain;
   }
 
@@ -321,7 +322,11 @@
   {
     try
     {
-      createNewDomain(configuration);
+      ReplicationDomain rd = createNewDomain(configuration);
+      if (isRegistered)
+      {
+        rd.start();
+      }
       return new ConfigChangeResult(ResultCode.SUCCESS, false);
     } catch (ConfigException e)
     {
@@ -507,6 +512,8 @@
   @Override
   public void finalizeSynchronizationProvider()
   {
+    isRegistered = false;
+
     // shutdown all the domains
     for (ReplicationDomain domain : domains.values())
     {
@@ -731,6 +738,18 @@
 
     return new ConfigChangeResult(ResultCode.SUCCESS, false);
   }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void completeSynchronizationProvider()
+  {
+    isRegistered = true;
+
+    // start all the domains
+    for (ReplicationDomain domain : domains.values())
+    {
+      domain.start();
+    }
+  }
 }
-
-
diff --git a/opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java b/opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java
index 89ed473..760d42b 100644
--- a/opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java
+++ b/opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java
@@ -266,7 +266,7 @@
    * A boolean indicating if the thread used to save the persistentServerState
    * is terminated.
    */
-  private boolean done = false;
+  private boolean done = true;
 
   /**
    * This class contain the context related to an import or export
@@ -1222,6 +1222,8 @@
   @Override
   public void run()
   {
+    done = false;
+
     // Create the listener thread
     listenerThread = new ListenerThread(this, updateToReplayQueue);
     listenerThread.start();
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/DependencyTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/DependencyTest.java
index 3769f68..4f88f92 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/DependencyTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/DependencyTest.java
@@ -179,6 +179,7 @@
       domainConf.setHeartbeatInterval(100000);
 
       domain = MultimasterReplication.createNewDomain(domainConf);
+      replicationPlugin.completeSynchronizationProvider();
 
       // check that last entry in sequence got added.
       Entry lastEntry = getEntry(DN.decode(addDn), 30000, true);
@@ -304,6 +305,7 @@
 
       Thread.sleep(2000);
       domain = MultimasterReplication.createNewDomain(domainConf);
+      replicationPlugin.completeSynchronizationProvider();
       
       ReplicationBroker broker =
         openReplicationSession(baseDn, brokerId, 1000, replServerPort, 1000,
@@ -502,6 +504,7 @@
         new DomainFakeCfg(baseDn, serverId, replServers);
 
       domain = MultimasterReplication.createNewDomain(domainConf);
+      replicationPlugin.completeSynchronizationProvider();
 
       // check that all entries have been deleted and added
       // again by checking that they do have the correct entryuuid
@@ -626,6 +629,7 @@
         new DomainFakeCfg(baseDn, serverId, replServers);
 
       domain = MultimasterReplication.createNewDomain(domainConf);
+      replicationPlugin.completeSynchronizationProvider();
 
       // check that all entries have been renamed
       for (sequence = 1; sequence<=AddSequenceLength; sequence ++)
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ReplicationServerFailoverTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ReplicationServerFailoverTest.java
index 0d552b1..994053f 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ReplicationServerFailoverTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ReplicationServerFailoverTest.java
@@ -411,6 +411,7 @@
       //domainConf.setHeartbeatInterval(500);
       ReplicationDomain replicationDomain =
         MultimasterReplication.createNewDomain(domainConf);
+      replicationDomain.start();
 
       // Add other server (doing that after connection insure we connect to
       // the right server)

--
Gitblit v1.10.0