From f9d651d2e1cbcd944a2d69061018f1e904a4ef79 Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Wed, 07 Oct 2009 15:34:57 +0000
Subject: [PATCH] Fix Issue 4267  ECL - draft: (changenumber>=X) filter causes Operations Error

---
 opends/src/server/org/opends/server/replication/server/ECLServerHandler.java |   34 ++++++++++++++++++++++++++++++----
 1 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java b/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
index a93956a..82aacd7 100644
--- a/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
@@ -499,7 +499,7 @@
     draftCompat = true;
 
     DraftCNDbHandler draftCNDb = replicationServer.getDraftCNDbHandler();
-    if (startDraftCN < 0)
+    if (startDraftCN <= 1)
     {
       // Request filter does not contain any firstDraftCN
       // So we'll generate from the beginning of what we have stored here.
@@ -579,9 +579,35 @@
         {
           // startDraftCN is between first and last and has never been
           // returned yet
-          crossDomainStartState = draftCNDb.getValue(draftCNDb.getLastKey());
-          // FIXME:ECL ... ok we'll start from the end of the draftCNDb BUT ...
-          // this is NOT the request of the client !!!!
+          if (draftCNDb.count() == 0)
+          {
+            // db is empty
+            isEndOfDraftCNReached = true;
+            crossDomainStartState = null;
+          }
+          else
+          {
+            crossDomainStartState = draftCNDb.getValue(draftCNDb.getLastKey());
+            try
+            {
+              draftCNDbIter =
+                draftCNDb.generateIterator(draftCNDb.getLastKey());
+            }
+            catch(Exception e)
+            {
+              TRACER.debugCaught(DebugLogLevel.ERROR, e);
+
+              if (draftCNDbIter != null)
+                draftCNDbIter.releaseCursor();
+
+              throw new DirectoryException(
+                  ResultCode.OPERATIONS_ERROR,
+                  Message.raw(Category.SYNC,
+                      Severity.FATAL_ERROR,e.getLocalizedMessage()));
+            }
+          }
+          // TODO:ECL ... ok we'll start from the end of the draftCNDb BUT ...
+          // this may be very long. Work on perf improvement here.
         }
         else
         {

--
Gitblit v1.10.0