From 8480c9ba20d5966c24630233e0384ab9ca55ab03 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Wed, 02 Jul 2014 08:18:44 +0000
Subject: [PATCH] OPENDJ-1471 File based changelog : improve cursor behavior CR-3920

---
 opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBCursor.java                       |    6 ------
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBTest.java |    6 ++++--
 opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java                                  |    2 +-
 opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/file/ReplicationEnvironment.java                              |    3 +--
 opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBCursor.java                           |   22 ++++++++++++++++++----
 opendj-sdk/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java                                                   |   11 +++++------
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java     |    6 ++++--
 7 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
index ed15dd4..a4591c6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ECLServerHandler.java
@@ -548,12 +548,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);
 
@@ -572,8 +571,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);
@@ -582,7 +580,7 @@
       }
 
       cnIndexDBCursor = cursor;
-      return oldestRecord.getPreviousCookie();
+      return cursor.getRecord().getPreviousCookie();
     }
     else if (startChangeNumber <= newestChangeNumber)
     {
@@ -613,6 +611,7 @@
   {
     DBCursor<ChangeNumberIndexRecord> cursor =
         cnIndexDB.getCursorFrom(startChangeNumber);
+    cursor.next();
     if (cursor.getRecord() == null)
     {
       close(cursor);
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java
index a1abe41..23be4f7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/api/ChangeNumberIndexDB.java
+++ b/opendj-sdk/opends/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/opends/src/server/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBCursor.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBCursor.java
index b5e2502..6b967be 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBCursor.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBCursor.java
@@ -31,10 +31,6 @@
 
 /**
  * A cursor on ChangeNumberIndexDB.
- * <p>
- * The cursor initially points to a record, that is {@code cursor.getRecord()}
- * is equals to the first record available from the cursor before any call to
- * {@code cursor.next()} method.
  */
 class FileChangeNumberIndexDBCursor implements DBCursor<ChangeNumberIndexRecord>
 {
@@ -54,8 +50,6 @@
       throws ChangelogException
   {
     this.cursor = cursor;
-    // cursor is positioned to first record at start
-    next();
   }
 
   /** {@inheritDoc} */
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/file/ReplicationEnvironment.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/file/ReplicationEnvironment.java
index 0f8c88e..65cd39c 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/file/ReplicationEnvironment.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/file/ReplicationEnvironment.java
@@ -120,8 +120,7 @@
 {
   private static final DebugTracer TRACER = getTracer();
 
-  // TODO : to replace by configurable value
-  private static final long MAX_LOG_FILE_SIZE_IN_BYTES = 10*1024;
+  private static final long MAX_LOG_FILE_SIZE_IN_BYTES = 10*1024*1024;
 
   private static final int NO_GENERATION_ID = -1;
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBCursor.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBCursor.java
index 35dd2b0..dc48330 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBCursor.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBCursor.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2009 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2013 ForgeRock AS
+ *      Portions Copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.replication.server.changelog.je;
 
@@ -44,7 +44,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
@@ -66,7 +72,7 @@
   {
     try
     {
-      return this.draftCNDbCursor.currentRecord();
+      return isInitialized ? draftCNDbCursor.currentRecord() : null;
     }
     catch (Exception e)
     {
@@ -81,7 +87,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/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBTest.java
index fe5428e..cf896e6 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBTest.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/file/FileChangeNumberIndexDBTest.java
@@ -204,6 +204,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));
@@ -319,6 +320,7 @@
     DBCursor<ChangeNumberIndexRecord> cursor = cnIndexDB.getCursorFrom(changeNumber);
     try
     {
+      cursor.next();
       return cursor.getRecord().getPreviousCookie();
     }
     finally
@@ -334,10 +336,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
     {
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java
index 4c85472..4f6fd24 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/JEChangeNumberIndexDBTest.java
+++ b/opendj-sdk/opends/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