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