From 9b581fcaa5c5cab99677a3fd043c62260f4dfa7c Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Thu, 17 Sep 2009 12:47:21 +0000
Subject: [PATCH] 

---
 opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java |  132 +++++++++++++++++++++++---------------------
 1 files changed, 69 insertions(+), 63 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java b/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
index 3890f49..7a4a8d4 100644
--- a/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
+++ b/opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -4192,84 +4192,90 @@
       ChangeNumber replServerMaxChangeNumber =
         replicationServerState.getMaxChangeNumber(serverId);
 
-      if (replServerMaxChangeNumber == null)
+      // we don't want to update from here (a DS) an empty RS because
+      // normally the RS should have been updated by other RSes except for
+      // very last changes lost if the local connection was broken
+      // ... hence the RS we are connected to should not be empty
+      // ... or if it is empty, it is due to a volontary reset
+      // and we don't want to update it with our changes that could be huge.
+      if ((replServerMaxChangeNumber != null) &&
+          (replServerMaxChangeNumber.getSeqnum()!=0))
       {
-        replServerMaxChangeNumber = new ChangeNumber(0, 0, serverId);
-      }
-      ChangeNumber ourMaxChangeNumber =
-        state.getMaxChangeNumber(serverId);
+        ChangeNumber ourMaxChangeNumber =
+          state.getMaxChangeNumber(serverId);
 
-      if ((ourMaxChangeNumber != null) &&
-          (!ourMaxChangeNumber.olderOrEqual(replServerMaxChangeNumber)))
-      {
-
-        // Replication server is missing some of our changes: let's
-        // send them to him.
-
-        Message message = DEBUG_GOING_TO_SEARCH_FOR_CHANGES.get();
-        logError(message);
-
-        /*
-         * Get all the changes that have not been seen by this
-         * replication server and populate the replayOperations
-         * list.
-         */
-        InternalSearchOperation op = searchForChangedEntries(
-            baseDn, replServerMaxChangeNumber, this);
-        if (op.getResultCode() != ResultCode.SUCCESS)
+        if ((ourMaxChangeNumber != null) &&
+            (!ourMaxChangeNumber.olderOrEqual(replServerMaxChangeNumber)))
         {
-          /*
-           * An error happened trying to search for the updates
-           * This server will start accepting again new updates but
-           * some inconsistencies will stay between servers.
-           * Log an error for the repair tool
-           * that will need to re-synchronize the servers.
-           */
-          message = ERR_CANNOT_RECOVER_CHANGES.get(
-              baseDn.toNormalizedString());
+
+          // Replication server is missing some of our changes: let's
+          // send them to him.
+
+          Message message = DEBUG_GOING_TO_SEARCH_FOR_CHANGES.get();
           logError(message);
-        } else
-        {
-          for (FakeOperation replayOp :
-            replayOperations.tailMap(replServerMaxChangeNumber).values())
-          {
-            ChangeNumber cn = replayOp.getChangeNumber();
-            /*
-             * Because the entry returned by the search operation
-             * can contain old historical information, it is
-             * possible that some of the FakeOperation are
-             * actually older than the last ChangeNumber known by
-             * the Replication Server.
-             * In such case don't send the operation.
-             */
-            if (!cn.newer(replServerMaxChangeNumber))
-            {
-              continue;
-            }
 
+          /*
+           * Get all the changes that have not been seen by this
+           * replication server and populate the replayOperations
+           * list.
+           */
+          InternalSearchOperation op = searchForChangedEntries(
+              baseDn, replServerMaxChangeNumber, this);
+          if (op.getResultCode() != ResultCode.SUCCESS)
+          {
             /*
-             * Check if the DeleteOperation has been abandoned before
-             * being processed. This is necessary because the replayOperation
-             *
+             * An error happened trying to search for the updates
+             * This server will start accepting again new updates but
+             * some inconsistencies will stay between servers.
+             * Log an error for the repair tool
+             * that will need to re-synchronize the servers.
              */
-            if (replayOp instanceof FakeDelOperation)
+            message = ERR_CANNOT_RECOVER_CHANGES.get(
+                baseDn.toNormalizedString());
+            logError(message);
+          } else
+          {
+            for (FakeOperation replayOp :
+              replayOperations.tailMap(replServerMaxChangeNumber).values())
             {
-              FakeDelOperation delOp = (FakeDelOperation) replayOp;
-              if (findEntryDN(delOp.getUUID()) != null)
+              ChangeNumber cn = replayOp.getChangeNumber();
+              /*
+               * Because the entry returned by the search operation
+               * can contain old historical information, it is
+               * possible that some of the FakeOperation are
+               * actually older than the last ChangeNumber known by
+               * the Replication Server.
+               * In such case don't send the operation.
+               */
+              if (!cn.newer(replServerMaxChangeNumber))
               {
                 continue;
               }
+
+              /*
+               * Check if the DeleteOperation has been abandoned before
+               * being processed. This is necessary because the replayOperation
+               *
+               */
+              if (replayOp instanceof FakeDelOperation)
+              {
+                FakeDelOperation delOp = (FakeDelOperation) replayOp;
+                if (findEntryDN(delOp.getUUID()) != null)
+                {
+                  continue;
+                }
+              }
+              message =
+                DEBUG_SENDING_CHANGE.get(
+                    replayOp.getChangeNumber().toString());
+              logError(message);
+              session.publish(replayOp.generateMessage());
             }
-            message =
-              DEBUG_SENDING_CHANGE.get(
-                  replayOp.getChangeNumber().toString());
+            message = DEBUG_CHANGES_SENT.get();
             logError(message);
-            session.publish(replayOp.generateMessage());
           }
-          message = DEBUG_CHANGES_SENT.get();
-          logError(message);
+          replayOperations.clear();
         }
-        replayOperations.clear();
       }
     } catch (Exception e)
     {

--
Gitblit v1.10.0