From 6a7fdc04408e52abb5e5cacdc03f51a8e995d5cf Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Fri, 01 Apr 2011 20:29:09 +0000
Subject: [PATCH] Fix issue OPENDJ-105: Replication protocol error. Bad message type. org.opends.server.replication.protocol.StopMsg received, ReplServerStartMsg required

---
 opends/src/server/org/opends/server/replication/server/ReplicationServerHandler.java |   39 ++++++++++++++++++++++++++++-----------
 opends/src/server/org/opends/server/replication/server/ServerReader.java             |   16 ++--------------
 2 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServerHandler.java b/opends/src/server/org/opends/server/replication/server/ReplicationServerHandler.java
index d3f2dfd..e3787df 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServerHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServerHandler.java
@@ -43,11 +43,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.protocol.ProtocolSession;
-import org.opends.server.replication.protocol.ProtocolVersion;
-import org.opends.server.replication.protocol.ReplServerStartMsg;
-import org.opends.server.replication.protocol.ReplicationMsg;
-import org.opends.server.replication.protocol.TopologyMsg;
+import org.opends.server.replication.protocol.*;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeBuilder;
 import org.opends.server.types.Attributes;
@@ -195,9 +191,19 @@
       // Reject bad responses
       if (!(msg instanceof ReplServerStartMsg))
       {
-        Message message = ERR_REPLICATION_PROTOCOL_MESSAGE_TYPE.get(
-            msg.getClass().getCanonicalName(),
-            "ReplServerStartMsg");
+        Message message;
+        if (msg instanceof StopMsg)
+        {
+          // Remote replication server is probably shutting down.
+          message = ERR_RS_DISCONNECTED_DURING_HANDSHAKE.get(
+              String.valueOf(getReplicationServerId()),
+              session.getReadableRemoteAddress());
+        }
+        else
+        {
+          message = ERR_REPLICATION_PROTOCOL_MESSAGE_TYPE.get(msg
+              .getClass().getCanonicalName(), "ReplServerStartMsg");
+        }
         abortStart(message);
         return;
       }
@@ -495,9 +501,20 @@
 
     if (!(msg instanceof TopologyMsg))
     {
-      Message message = ERR_REPLICATION_PROTOCOL_MESSAGE_TYPE.get(
-          msg.getClass().getCanonicalName(),
-          "TopologyMsg");
+      Message message;
+      if (msg instanceof StopMsg)
+      {
+        // Remote replication server is probably shutting down.
+        message = ERR_RS_DISCONNECTED_DURING_HANDSHAKE.get(
+            String.valueOf(getReplicationServerId()),
+            session.getReadableRemoteAddress());
+      }
+      else
+      {
+        message = ERR_REPLICATION_PROTOCOL_MESSAGE_TYPE.get(
+            msg.getClass().getCanonicalName(),
+            "TopologyMsg");
+      }
       abortStart(message);
     }
 
diff --git a/opends/src/server/org/opends/server/replication/server/ServerReader.java b/opends/src/server/org/opends/server/replication/server/ServerReader.java
index 7517b25..43147e9 100644
--- a/opends/src/server/org/opends/server/replication/server/ServerReader.java
+++ b/opends/src/server/org/opends/server/replication/server/ServerReader.java
@@ -40,7 +40,6 @@
 import org.opends.server.loggers.debug.DebugTracer;
 import org.opends.server.replication.common.ServerStatus;
 import org.opends.server.replication.protocol.*;
-import org.opends.server.types.DebugLogLevel;
 
 /**
  * This class implement the part of the replicationServer that is reading
@@ -222,19 +221,8 @@
           } else if (msg instanceof TopologyMsg)
           {
             TopologyMsg topoMsg = (TopologyMsg) msg;
-            try
-            {
-              ReplicationServerHandler rsh = (ReplicationServerHandler)handler;
-              rsh.receiveTopoInfoFromRS(topoMsg);
-            }
-            catch(Exception e)
-            {
-              TRACER.debugCaught(DebugLogLevel.ERROR, e);
-              errMessage =
-                ERR_REPLICATION_PROTOCOL_MESSAGE_TYPE.get(
-                    "TopologyMsg", "other");
-              logError(errMessage);
-            }
+            ReplicationServerHandler rsh = (ReplicationServerHandler)handler;
+            rsh.receiveTopoInfoFromRS(topoMsg);
           } else if (msg instanceof ChangeStatusMsg)
           {
             ChangeStatusMsg csMsg = (ChangeStatusMsg) msg;

--
Gitblit v1.10.0