From 0ef56d4515f70530da93570f9af3a0744fe77d12 Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Thu, 15 Nov 2007 16:50:07 +0000
Subject: [PATCH] Fix #2424 impact of generation ID on binary copy - an LDAP server that has already sent changes must not be able to replicate with an empty replication server

---
 opends/src/server/org/opends/server/replication/server/ServerHandler.java |   20 +++++++++++++++++++-
 opends/src/server/org/opends/server/replication/common/ServerState.java   |   10 ++++++++++
 2 files changed, 29 insertions(+), 1 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/common/ServerState.java b/opends/src/server/org/opends/server/replication/common/ServerState.java
index 530e914..1f8b711 100644
--- a/opends/src/server/org/opends/server/replication/common/ServerState.java
+++ b/opends/src/server/org/opends/server/replication/common/ServerState.java
@@ -329,4 +329,14 @@
     }
     return true;
   }
+
+  /**
+   * Tests if the state is empty.
+   *
+   * @return True if the state is empty.
+   */
+  public boolean isEmpty()
+  {
+    return list.isEmpty();
+  }
 }
diff --git a/opends/src/server/org/opends/server/replication/server/ServerHandler.java b/opends/src/server/org/opends/server/replication/server/ServerHandler.java
index 41fcfae..15de178 100644
--- a/opends/src/server/org/opends/server/replication/server/ServerHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/ServerHandler.java
@@ -359,7 +359,25 @@
         }
         else
         {
-          replicationCache.setGenerationId(generationId, false);
+          // We are an empty Replicationserver
+          if ((generationId>0)&&(!serverState.isEmpty()))
+          {
+            // If the LDAP server has already sent changes
+            // it is not expected to connect to an empty RS
+            Message message = NOTE_BAD_GENERATION_ID.get(
+                receivedMsg.getBaseDn().toNormalizedString(),
+                Short.toString(receivedMsg.getServerId()),
+                Long.toString(generationId),
+                Long.toString(localGenerationId));
+
+            ErrorMessage errorMsg =
+              new ErrorMessage(replicationServerId, serverId, message);
+            session.publish(errorMsg);
+          }
+          else
+          {
+            replicationCache.setGenerationId(generationId, false);
+          }
         }
       }
       else if (msg instanceof ReplServerStartMessage)

--
Gitblit v1.10.0