From 46f6e918d0b0b3e6e425878f5e7c97c087c5036e Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Mon, 22 Sep 2014 12:59:17 +0000
Subject: [PATCH] OPENDJ-1471 File based changelog : improve cursor behavior CR-3920

---
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java                              |    2 +-
 opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java |    6 ++++--
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/ECLServerHandler.java                                               |   11 +++++------
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBCursor.java                       |   20 +++++++++++++++++---
 4 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/ECLServerHandler.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/ECLServerHandler.java
index acf4fd4..b015eac 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/ECLServerHandler.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/ECLServerHandler.java
@@ -552,12 +552,11 @@
     // Read the CNIndexDB to see whether it contains startChangeNumber
     DBCursor<ChangeNumberIndexRecord> cursor =
         cnIndexDB.getCursorFrom(startChangeNumber);
-    final ChangeNumberIndexRecord startRecord = cursor.getRecord();
-    if (startRecord != null)
+    if (cursor.next())
     {
       // found the provided startChangeNumber, let's return it
       cnIndexDBCursor = cursor;
-      return startRecord.getPreviousCookie();
+      return cursor.getRecord().getPreviousCookie();
     }
     close(cursor);
 
@@ -576,8 +575,7 @@
     if (startChangeNumber < oldestChangeNumber)
     {
       cursor = cnIndexDB.getCursorFrom(oldestChangeNumber);
-      final ChangeNumberIndexRecord oldestRecord = cursor.getRecord();
-      if (oldestRecord == null)
+      if (!cursor.next())
       {
         // This should not happen
         close(cursor);
@@ -586,7 +584,7 @@
       }
 
       cnIndexDBCursor = cursor;
-      return oldestRecord.getPreviousCookie();
+      return cursor.getRecord().getPreviousCookie();
     }
     else if (startChangeNumber <= newestChangeNumber)
     {
@@ -617,6 +615,7 @@
   {
     DBCursor<ChangeNumberIndexRecord> cursor =
         cnIndexDB.getCursorFrom(startChangeNumber);
+    cursor.next();
     if (cursor.getRecord() == null)
     {
       close(cursor);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java
index a1abe41..23be4f7 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java
@@ -89,7 +89,7 @@
    *
    * @param startChangeNumber
    *          The position where the iterator must start.
-   * @return a new ReplicationIterator that allows to browse this DB managed by
+   * @return a new DBCursor that allows to browse this DB managed by
    *         this object and starting at the position defined by a given
    *         changeNumber.
    * @throws ChangelogException
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBCursor.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBCursor.java
index c937e90..b33d6d8 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBCursor.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBCursor.java
@@ -42,7 +42,13 @@
   private DraftCNDBCursor draftCNDbCursor;
 
   /**
-   * Creates a new ReplicationIterator. All created iterator must be released by
+   * As underlying cursor is already pointing to a record at start, this
+   * indicator allow to shift the pointed record at initialization time.
+   */
+  private boolean isInitialized = false;
+
+  /**
+   * Creates a new DB Cursor. All created iterator must be released by
    * the caller using the {@link #close()} method.
    *
    * @param db
@@ -64,7 +70,7 @@
   {
     try
     {
-      return this.draftCNDbCursor.currentRecord();
+      return isInitialized ? draftCNDbCursor.currentRecord() : null;
     }
     catch (Exception e)
     {
@@ -79,7 +85,15 @@
   {
     if (draftCNDbCursor != null)
     {
-      return draftCNDbCursor.next();
+      if (!isInitialized)
+      {
+        isInitialized = true;
+        return draftCNDbCursor.currentRecord() != null;
+      }
+      else
+      {
+        return draftCNDbCursor.next();
+      }
     }
     return false;
   }
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java
index ed77f379..3f03539 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java
@@ -123,6 +123,7 @@
       DBCursor<ChangeNumberIndexRecord> cursor = cnIndexDB.getCursorFrom(oldestCN);
       try
       {
+        assertTrue(cursor.next());
         assertEqualTo(cursor.getRecord(), csns[0], baseDN1, cookies.get(0));
         assertTrue(cursor.next());
         assertEqualTo(cursor.getRecord(), csns[1], baseDN2, cookies.get(1));
@@ -282,6 +283,7 @@
     DBCursor<ChangeNumberIndexRecord> cursor = cnIndexDB.getCursorFrom(changeNumber);
     try
     {
+      cursor.next();
       return cursor.getRecord().getPreviousCookie();
     }
     finally
@@ -297,10 +299,10 @@
     {
       for (int i = 0; i < cns.length; i++)
       {
+        assertTrue(cursor.next());
         assertEquals(cursor.getRecord().getChangeNumber(), cns[i]);
-        final boolean isNotLast = i + 1 < cns.length;
-        assertEquals(cursor.next(), isNotLast);
       }
+      assertFalse(cursor.next());
     }
     finally
     {

--
Gitblit v1.10.0