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