From d2ec418d6010332f55828d53c613a3c3e9d03d9e Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 05 Sep 2013 09:32:32 +0000
Subject: [PATCH] OPENDJ-1116 Introduce abstraction for the changelog DB

---
 opends/src/server/org/opends/server/replication/server/ReplicationServer.java |   31 +++++++++++++++----------------
 1 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index 11f6507..7ea509d 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -914,18 +914,6 @@
             TRACER.debugCaught(DebugLogLevel.WARNING, ignored);
           }
         }
-
-        try
-        {
-          lastGeneratedChangeNumber = cnIndexDB.getLastChangeNumber();
-        }
-        catch (Exception ignored)
-        {
-          if (debugEnabled())
-          {
-            TRACER.debugCaught(DebugLogLevel.WARNING, ignored);
-          }
-        }
       }
     }
   }
@@ -1638,16 +1626,19 @@
         if (cnIndexDB == null)
         {
           cnIndexDB = new DraftCNDbHandler(this, this.dbEnv);
-          lastGeneratedChangeNumber = cnIndexDB.getLastChangeNumber();
+          final CNIndexData lastCNData = cnIndexDB.getLastCNIndexData();
+          // initialization of the lastGeneratedChangeNumebr from the DB content
+          // if DB is empty => lastCNData is null => Default to 0
+          lastGeneratedChangeNumber =
+              (lastCNData != null) ? lastCNData.getChangeNumber() : 0;
         }
         return cnIndexDB;
       }
       catch (Exception e)
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        MessageBuilder mb = new MessageBuilder();
-        mb.append(ERR_DRAFT_CHANGENUMBER_DATABASE.get(""));
-        throw new DirectoryException(OPERATIONS_ERROR, mb.toMessage(), e);
+        Message message = ERR_CHANGENUMBER_DATABASE.get(e.getMessage());
+        throw new DirectoryException(OPERATIONS_ERROR, message, e);
       }
     }
   }
@@ -1715,6 +1706,14 @@
       String domainForLastCN = null;
       if (firstCNData != null)
       {
+        if (lastCNData == null)
+        {
+          // Edge case: DB was cleaned or closed in between call to getFirst*()
+          // and getLast*(). The only remaining solution is to fail fast.
+          throw new ChangelogException(
+              ERR_READING_FIRST_THEN_LAST_IN_CHANGENUMBER_DATABASE.get());
+        }
+
         dbEmpty = false;
         firstChangeNumber = firstCNData.getChangeNumber();
         lastChangeNumber = lastCNData.getChangeNumber();

--
Gitblit v1.10.0