From ce949f4b26b4c2adcaae36784180e15a3d68abde Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Fri, 07 Oct 2011 10:09:52 +0000
Subject: [PATCH] Fix OPENDJ-115: Make replication connection timeouts and various monitoring intervals configurable

---
 opends/resource/schema/02-config.ldif                                                                              |    3 +
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/AssuredReplicationPluginTest.java   |    3 +
 opends/src/server/org/opends/server/replication/server/ReplicationServer.java                                      |   14 +++---
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/MultimasterReplicationFakeConf.java |    8 +++
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ReplicationServerTest.java          |    8 ++--
 opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java                                 |   20 ++++++++++
 opends/src/server/org/opends/server/replication/protocol/ReplSessionSecurity.java                                  |   11 -----
 opends/src/server/org/opends/server/replication/service/ReplicationBroker.java                                     |    7 ++-
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/AssuredReplicationServerTest.java   |    7 ++-
 opends/src/admin/defn/org/opends/server/admin/std/ReplicationSynchronizationProviderConfiguration.xml              |   20 ++++++++++
 opends/src/admin/messages/ReplicationSynchronizationProviderCfgDefn.properties                                     |    1 
 11 files changed, 71 insertions(+), 31 deletions(-)

diff --git a/opends/resource/schema/02-config.ldif b/opends/resource/schema/02-config.ldif
index bb28aec..06b6ad4 100644
--- a/opends/resource/schema/02-config.ldif
+++ b/opends/resource/schema/02-config.ldif
@@ -3609,7 +3609,8 @@
   NAME 'ds-cfg-replication-synchronization-provider'
   SUP ds-cfg-synchronization-provider
   STRUCTURAL
-  MAY ( ds-cfg-num-update-replay-threads )
+  MAY ( ds-cfg-num-update-replay-threads $
+        ds-cfg-connection-timeout )
   X-ORIGIN 'OpenDS Directory Server' )
 objectClasses: ( 1.3.6.1.4.1.26027.1.2.94
   NAME 'ds-cfg-dictionary-password-validator'
diff --git a/opends/src/admin/defn/org/opends/server/admin/std/ReplicationSynchronizationProviderConfiguration.xml b/opends/src/admin/defn/org/opends/server/admin/std/ReplicationSynchronizationProviderConfiguration.xml
index 98586d7..84730ca 100644
--- a/opends/src/admin/defn/org/opends/server/admin/std/ReplicationSynchronizationProviderConfiguration.xml
+++ b/opends/src/admin/defn/org/opends/server/admin/std/ReplicationSynchronizationProviderConfiguration.xml
@@ -104,4 +104,24 @@
       </ldap:attribute>
     </adm:profile>
   </adm:property>
+
+  <adm:property name="connection-timeout" advanced="true">
+    <adm:synopsis>
+      Specifies the timeout used when connecting to peers and when performing
+      SSL negotiation.
+    </adm:synopsis>
+    <adm:default-behavior>
+      <adm:defined>
+        <adm:value>5 seconds</adm:value>
+      </adm:defined>
+    </adm:default-behavior>
+    <adm:syntax>
+      <adm:duration base-unit="ms" lower-limit="0" />
+    </adm:syntax>
+    <adm:profile name="ldap">
+      <ldap:attribute>
+        <ldap:name>ds-cfg-connection-timeout</ldap:name>
+      </ldap:attribute>
+    </adm:profile>
+  </adm:property>
 </adm:managed-object>
diff --git a/opends/src/admin/messages/ReplicationSynchronizationProviderCfgDefn.properties b/opends/src/admin/messages/ReplicationSynchronizationProviderCfgDefn.properties
index 8f83bce..dc8718b 100644
--- a/opends/src/admin/messages/ReplicationSynchronizationProviderCfgDefn.properties
+++ b/opends/src/admin/messages/ReplicationSynchronizationProviderCfgDefn.properties
@@ -1,6 +1,7 @@
 user-friendly-name=Replication Synchronization Provider
 user-friendly-plural-name=Replication Synchronization Providers
 synopsis=The Replication Synchronization Provider provides multi-master replication of data across multiple directory server instances.
+property.connection-timeout.synopsis=Specifies the timeout used when connecting to peers and when performing SSL negotiation.
 property.enabled.synopsis=Indicates whether the Replication Synchronization Provider is enabled for use.
 property.java-class.synopsis=Specifies the fully-qualified name of the Java class that provides the Replication Synchronization Provider implementation.
 property.num-update-replay-threads.synopsis=Specifies the number of update replay threads.
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 294e65f..80acfb0 100644
--- a/opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java
+++ b/opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java
@@ -123,6 +123,11 @@
   private static boolean initializationCompleted = true;
 
   /**
+   * The configurable connection/handshake timeout.
+   */
+  private static volatile int connectionTimeoutMS = 5000;
+
+  /**
    * Finds the domain for a given DN.
    *
    * @param dn         The DN for which the domain must be returned.
@@ -285,6 +290,8 @@
     configuration.addReplicationChangeListener(this);
 
     replayThreadNumber = configuration.getNumUpdateReplayThreads();
+    connectionTimeoutMS = (int) Math.min(configuration.getConnectionTimeout(),
+        Integer.MAX_VALUE);
 
     //  Create the list of domains that are already defined.
     for (String name : configuration.listReplicationDomains())
@@ -821,6 +828,9 @@
       createReplayThreads();
     }
 
+    connectionTimeoutMS = (int) Math.min(configuration.getConnectionTimeout(),
+        Integer.MAX_VALUE);
+
     return new ConfigChangeResult(ResultCode.SUCCESS, false);
   }
 
@@ -882,4 +892,14 @@
     return false;
   }
 
+  /**
+   * Returns the connection timeout in milli-seconds.
+   *
+   * @return The connection timeout in milli-seconds.
+   */
+  public static int getConnectionTimeoutMS()
+  {
+    return connectionTimeoutMS;
+  }
+
 }
diff --git a/opends/src/server/org/opends/server/replication/protocol/ReplSessionSecurity.java b/opends/src/server/org/opends/server/replication/protocol/ReplSessionSecurity.java
index 7a4fa69..97409cb 100644
--- a/opends/src/server/org/opends/server/replication/protocol/ReplSessionSecurity.java
+++ b/opends/src/server/org/opends/server/replication/protocol/ReplSessionSecurity.java
@@ -77,17 +77,6 @@
    */
   private final String sslCipherSuites[];
 
-  /**
-   * The default soTimeout value to be used at handshake phases. (DS<->RS and
-   * RS<->RS)
-   */
-  public static final int HANDSHAKE_TIMEOUT = 4000;
-
-  /**
-   * The default connection timeout.
-   */
-  public static final int CONNECTION_TIMEOUT = 4000;
-
 
 
   /**
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 787da14..ea5ee1e 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -60,6 +60,7 @@
 import org.opends.server.core.networkgroups.NetworkGroup;
 import org.opends.server.loggers.debug.DebugTracer;
 import org.opends.server.replication.common.*;
+import org.opends.server.replication.plugin.MultimasterReplication;
 import org.opends.server.replication.protocol.*;
 import org.opends.server.types.*;
 import org.opends.server.util.LDIFReader;
@@ -307,9 +308,9 @@
           newSocket = listenSocket.accept();
           newSocket.setTcpNoDelay(true);
           newSocket.setKeepAlive(true);
-          session =
-            replSessionSecurity.createServerSession(newSocket,
-                ReplSessionSecurity.HANDSHAKE_TIMEOUT);
+          int timeoutMS = MultimasterReplication.getConnectionTimeoutMS();
+          session = replSessionSecurity.createServerSession(newSocket,
+              timeoutMS);
           if (session == null) // Error, go back to accept
             continue;
         }
@@ -490,10 +491,9 @@
       InetSocketAddress ServerAddr = new InetSocketAddress(
           InetAddress.getByName(hostname), Integer.parseInt(port));
       socket.setTcpNoDelay(true);
-      socket.connect(ServerAddr, ReplSessionSecurity.CONNECTION_TIMEOUT);
-
-      session = replSessionSecurity.createClientSession(socket,
-          ReplSessionSecurity.HANDSHAKE_TIMEOUT);
+      int timeoutMS = MultimasterReplication.getConnectionTimeoutMS();
+      socket.connect(ServerAddr, timeoutMS);
+      session = replSessionSecurity.createClientSession(socket, timeoutMS);
 
       ReplicationServerHandler handler = new ReplicationServerHandler(
           session, queueSize, this.serverURL, serverId, this,
diff --git a/opends/src/server/org/opends/server/replication/service/ReplicationBroker.java b/opends/src/server/org/opends/server/replication/service/ReplicationBroker.java
index 6bc7cce..6e254d8 100644
--- a/opends/src/server/org/opends/server/replication/service/ReplicationBroker.java
+++ b/opends/src/server/org/opends/server/replication/service/ReplicationBroker.java
@@ -68,6 +68,7 @@
 import org.opends.server.replication.common.RSInfo;
 import org.opends.server.replication.common.ServerState;
 import org.opends.server.replication.common.ServerStatus;
+import org.opends.server.replication.plugin.MultimasterReplication;
 import org.opends.server.replication.protocol.*;
 import org.opends.server.types.DebugLogLevel;
 import org.opends.server.util.ServerConstants;
@@ -1198,9 +1199,9 @@
       socket = new Socket();
       socket.setReceiveBufferSize(1000000);
       socket.setTcpNoDelay(true);
-      socket.connect(serverAddr, ReplSessionSecurity.CONNECTION_TIMEOUT);
-      localSession = replSessionSecurity.createClientSession(
-          socket, ReplSessionSecurity.HANDSHAKE_TIMEOUT);
+      int timeoutMS = MultimasterReplication.getConnectionTimeoutMS();
+      socket.connect(serverAddr, timeoutMS);
+      localSession = replSessionSecurity.createClientSession(socket, timeoutMS);
       boolean isSslEncryption = replSessionSecurity
           .isSslEncryption(server);
 
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/AssuredReplicationPluginTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/AssuredReplicationPluginTest.java
index 678cd4f..73e12b4 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/AssuredReplicationPluginTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/AssuredReplicationPluginTest.java
@@ -397,8 +397,9 @@
           newSocket.setKeepAlive(true);
           // Create client session
           ReplSessionSecurity replSessionSecurity = new ReplSessionSecurity();
+          int timeoutMS = MultimasterReplication.getConnectionTimeoutMS();
           session = replSessionSecurity.createServerSession(newSocket,
-            ReplSessionSecurity.HANDSHAKE_TIMEOUT);
+              timeoutMS);
           if (session == null) // Error, go back to accept
           {
             continue;
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/MultimasterReplicationFakeConf.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/MultimasterReplicationFakeConf.java
index fb086e0..604b9aa 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/MultimasterReplicationFakeConf.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/MultimasterReplicationFakeConf.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2009 Sun Microsystems, Inc.
+ *      Portions copyright 2011 ForgeRock AS.
  */
 package org.opends.server.replication.plugin;
 
@@ -46,7 +47,7 @@
     // TODO Auto-generated method stub
 
   }
-  
+
   public void addReplicationDomainAddListener(
       ConfigurationAddListener<ReplicationDomainCfg> listener)
       throws ConfigException
@@ -182,4 +183,9 @@
     return null;
   }
 
+  public long getConnectionTimeout()
+  {
+    return 5000;
+  }
+
 }
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/AssuredReplicationServerTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/AssuredReplicationServerTest.java
index bf9a71d..89ba2fe 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/AssuredReplicationServerTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/AssuredReplicationServerTest.java
@@ -54,6 +54,7 @@
 import org.opends.server.replication.common.AssuredMode;
 import org.opends.server.replication.common.ServerState;
 import org.opends.server.replication.common.ServerStatus;
+import org.opends.server.replication.plugin.MultimasterReplication;
 import org.opends.server.replication.protocol.ProtocolSession;
 import org.opends.server.replication.protocol.ProtocolVersion;
 import org.opends.server.replication.protocol.ReplServerStartMsg;
@@ -953,14 +954,14 @@
           new InetSocketAddress("localhost", port);
         Socket socket = new Socket();
         socket.setTcpNoDelay(true);
-        socket.connect(serverAddr, ReplSessionSecurity.CONNECTION_TIMEOUT);
+        int timeoutMS = MultimasterReplication.getConnectionTimeoutMS();
+        socket.connect(serverAddr, timeoutMS);
 
         // Create client session
         fakePort++;
         String fakeUrl = "localhost:" + fakePort;
         ReplSessionSecurity replSessionSecurity = new ReplSessionSecurity();
-        session = replSessionSecurity.createClientSession(socket,
-          ReplSessionSecurity.HANDSHAKE_TIMEOUT);
+        session = replSessionSecurity.createClientSession(socket, timeoutMS);
 
         // Send our repl server start msg
         ReplServerStartMsg replServerStartMsg = new ReplServerStartMsg(serverId,
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ReplicationServerTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ReplicationServerTest.java
index d0755d5..f0f4a0c 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ReplicationServerTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ReplicationServerTest.java
@@ -1013,11 +1013,11 @@
     Socket socket = new Socket();
     socket.setReceiveBufferSize(1000000);
     socket.setTcpNoDelay(true);
-    socket.connect(ServerAddr, ReplSessionSecurity.CONNECTION_TIMEOUT);
+    int timeoutMS = MultimasterReplication.getConnectionTimeoutMS();
+    socket.connect(ServerAddr, timeoutMS);
     ReplSessionSecurity replSessionSecurity = getReplSessionSecurity();
-    ProtocolSession session =
-         replSessionSecurity.createClientSession(socket,
-         ReplSessionSecurity.HANDSHAKE_TIMEOUT);
+    ProtocolSession session = replSessionSecurity.createClientSession(socket,
+        timeoutMS);
 
     boolean sslEncryption =
          DirectoryConfig.getCryptoManager().isSslEncryption();

--
Gitblit v1.10.0