From 3556ad0275d7271b6533569ac72cb741abdb0b81 Mon Sep 17 00:00:00 2001
From: gbellato <gbellato@localhost>
Date: Thu, 03 Jan 2008 14:00:38 +0000
Subject: [PATCH]  fix for 2787 : Replication Server sessions fails when disconnecting and re-connecting   When a ReplicationBroker disconnect and reconnect quickly to a Replication Server the reconnection sometimes fails.

---
 opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java |   99 +++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 82 insertions(+), 17 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java b/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
index 6382ca3..d97d2ad 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
@@ -215,6 +215,11 @@
       }
     }
 
+    if (generationId < 0)
+    {
+      generationId = sourceHandler.getGenerationId();
+    }
+
     // look for the dbHandler that is responsible for the LDAP server which
     // generated the change.
     DbHandler dbHandler = null;
@@ -225,8 +230,7 @@
       {
         try
         {
-          dbHandler = replicationServer.newDbHandler(id,
-              baseDn, generationId);
+          dbHandler = replicationServer.newDbHandler(id, baseDn);
           generationIdSavedStatus = true;
         }
         catch (DatabaseException e)
@@ -277,8 +281,25 @@
       handler.add(update, sourceHandler);
     }
 
+  }
 
-
+  /**
+   * Wait a short while for ServerId disconnection.
+   *
+   * @param serverId the serverId to be checked.
+   */
+  public void waitDisconnection(short serverId)
+  {
+    if (connectedServers.containsKey(serverId))
+    {
+      // try again
+      try
+      {
+        Thread.sleep(100);
+      } catch (InterruptedException e)
+      {
+      }
+    }
   }
 
   /**
@@ -339,22 +360,27 @@
         " for " + baseDn + " " +
         " stopServer " + handler.getMonitorInstanceName());
 
-    handler.stopHandler();
 
-    if (handler.isReplicationServer())
-    {
-      replicationServers.remove(handler.getServerId());
-    }
-    else
-    {
-      connectedServers.remove(handler.getServerId());
-    }
+      if (handler.isReplicationServer())
+      {
+        if (replicationServers.containsValue(handler))
+        {
+          replicationServers.remove(handler.getServerId());
+          handler.stopHandler();
+        }
+      }
+      else
+      {
+        if (connectedServers.containsValue(handler))
+        {
+          connectedServers.remove(handler.getServerId());
+          handler.stopHandler();
+        }
+      }
 
-    mayResetGenerationId();
-
-    // Update the remote replication servers with our list
-    // of connected LDAP servers
-    sendReplServerInfo();
+      // Update the remote replication servers with our list
+      // of connected LDAP servers
+      sendReplServerInfo();
   }
 
   /**
@@ -1238,6 +1264,45 @@
       return replicationServer;
     }
 
+    /**
+     * Process reception of a ReplServerInfoMessage.
+     *
+     * @param infoMsg The received message.
+     * @param handler The handler that received the message.
+     * @throws IOException when raised by the underlying session.
+     */
+    public void receiveReplServerInfo(
+        ReplServerInfoMessage infoMsg, ServerHandler handler) throws IOException
+    {
+      if (debugEnabled())
+      {
+        if (handler.isReplicationServer())
+          TRACER.debugInfo(
+           "In RS " + getReplicationServer().getServerId() +
+           " Receiving replServerInfo from " + handler.getServerId() +
+           " baseDn=" + baseDn +
+           " genId=" + infoMsg.getGenerationId());
+      }
+
+      mayResetGenerationId();
+      if (generationId < 0)
+        generationId = handler.getGenerationId();
+      if (generationId > 0 && (generationId != infoMsg.getGenerationId()))
+      {
+        Message message = NOTE_BAD_GENERATION_ID.get(
+            baseDn.toNormalizedString(),
+            Short.toString(handler.getServerId()),
+            Long.toString(infoMsg.getGenerationId()),
+            Long.toString(generationId));
+
+        ErrorMessage errorMsg = new ErrorMessage(
+            getReplicationServer().getServerId(),
+            handler.getServerId(),
+            message);
+        handler.sendError(errorMsg);
+      }
+    }
+
     /*
      * Monitor Data generation
      */

--
Gitblit v1.10.0