From b6fb33af50bd7570ad0fa2c4441af20a907de4f3 Mon Sep 17 00:00:00 2001
From: mrossign <mrossign@localhost>
Date: Thu, 19 Mar 2009 10:31:10 +0000
Subject: [PATCH] Fix for issue #3887: Dynamic assured replication configuration change may give few timeouts

---
 opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java |   42 +++++++++++++++++++++---------------------
 1 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java b/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
index db16f13..c2ff5cc 100644
--- a/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
+++ b/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -324,7 +324,7 @@
     this.updateToReplayQueue = updateToReplayQueue;
 
     // Get assured configuration
-    readAssuredConfig(configuration);
+    readAssuredConfig(configuration, false);
 
     setGroupId((byte)configuration.getGroupId());
     setURLs(configuration.getReferralsUrl());
@@ -408,17 +408,19 @@
    * a boolean indicating if the passed configuration has changed compared to
    * previous values and the changes require a reconnection.
    * @param configuration The configuration object
-   * @return True if the assured configuration changed and we need to reconnect
+   * @param allowReconnection Tells if one must reconnect if significant changes
+   *        occurred
    */
-  private boolean readAssuredConfig(ReplicationDomainCfg configuration)
+  private void readAssuredConfig(ReplicationDomainCfg configuration,
+    boolean allowReconnection)
   {
-    boolean needReconnect = false;
+    boolean needReconnection = false;
 
     byte newSdLevel = (byte) configuration.getAssuredSdLevel();
     if ((isAssured() && (getAssuredMode() == AssuredMode.SAFE_DATA_MODE)) &&
       (newSdLevel != getAssuredSdLevel()))
     {
-      needReconnect = true;
+      needReconnection = true;
     }
 
     AssuredType newAssuredType = configuration.getAssuredType();
@@ -427,25 +429,31 @@
       case NOT_ASSURED:
         if (isAssured())
         {
-          needReconnect = true;
+          needReconnection = true;
         }
         break;
       case SAFE_DATA:
         if (!isAssured() ||
           (isAssured() && (getAssuredMode() == AssuredMode.SAFE_READ_MODE)))
         {
-          needReconnect = true;
+          needReconnection = true;
         }
         break;
       case SAFE_READ:
         if (!isAssured() ||
           (isAssured() && (getAssuredMode() == AssuredMode.SAFE_DATA_MODE)))
         {
-          needReconnect = true;
+          needReconnection = true;
         }
         break;
     }
 
+    // Disconnect if required: changing configuration values before
+    // disconnection would make assured replication used immediately and
+    // disconnection could cause some timeouts error.
+    if (needReconnection && allowReconnection)
+      disableService();
+
     switch (newAssuredType)
     {
       case NOT_ASSURED:
@@ -461,12 +469,11 @@
         break;
     }
     setAssuredSdLevel(newSdLevel);
-
-    // Changing timeout does not require restart as it is not sent in
-    // StartSessionMsg
     setAssuredTimeout(configuration.getAssuredTimeout());
 
-    return needReconnect;
+    // Reconnect if required
+    if (needReconnection && allowReconnection)
+      enableService();
   }
 
   /**
@@ -2729,15 +2736,8 @@
         configuration.getHeartbeatInterval(),
         (byte)configuration.getGroupId());
 
-    // Get assured configuration
-    boolean needReconnect = readAssuredConfig(configuration);
-
-    // Reconnect if required
-    if (needReconnect)
-    {
-      disableService();
-      enableService();
-    }
+    // Read assured configuration and reconnect if needed
+    readAssuredConfig(configuration, true);
 
     return new ConfigChangeResult(ResultCode.SUCCESS, false);
   }

--
Gitblit v1.10.0