From 513eb83896bf4654aa0e3628c2666e307712a8cc Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 04 Dec 2013 14:47:03 +0000
Subject: [PATCH] ChangeNumberIndexer.java: In run(), made sure all cursors are properly closed, even in case of a RuntimeException terminating the thread. Moved resetNextChangeForInsertDBCursor() out of removeAllCursors(). In removeAllCursors(), closed the CompositeDBCursor.

---
 opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java   |   10 +++++++++-
 opends/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexer.java |   14 +++++++++++---
 opends/src/server/org/opends/server/replication/server/ServerHandler.java                    |    4 ++--
 3 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/ServerHandler.java b/opends/src/server/org/opends/server/replication/server/ServerHandler.java
index 8557f48..ca0195e 100644
--- a/opends/src/server/org/opends/server/replication/server/ServerHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/ServerHandler.java
@@ -145,7 +145,7 @@
   /**
    * The associated ServerWriter that sends messages to the remote server.
    */
-  protected ServerWriter writer = null;
+  protected ServerWriter writer;
 
   /**
    * The associated ServerReader that receives messages from the remote server.
@@ -202,7 +202,7 @@
   /**
    * Set when ServerWriter is stopping.
    */
-  protected boolean shutdownWriter = false;
+  protected volatile boolean shutdownWriter = false;
 
   /**
    * Weight of this remote server.
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexer.java b/opends/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexer.java
index 378e942..76d47bf 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexer.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexer.java
@@ -365,6 +365,7 @@
           if (doClear.get())
           {
             removeAllCursors();
+            resetNextChangeForInsertDBCursor();
             // No need to use CAS here because it is only for unit tests and at
             // this point all will have been cleaned up anyway.
             doClear.set(false);
@@ -434,7 +435,6 @@
           Thread.currentThread().interrupt();
         }
       }
-      removeAllCursors();
     }
     catch (ChangelogException e)
     {
@@ -448,6 +448,10 @@
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       // TODO JNR error message i18n
     }
+    finally
+    {
+      removeAllCursors();
+    }
   }
 
   private void moveForwardMediumConsistencyPoint(final CSN csn, final DN baseDN)
@@ -467,15 +471,19 @@
     }
   }
 
-  private void removeAllCursors() throws ChangelogException
+  private void removeAllCursors()
   {
+    if (nextChangeForInsertDBCursor != null)
+    {
+      nextChangeForInsertDBCursor.close();
+      nextChangeForInsertDBCursor = null;
+    }
     for (Map<Integer, DBCursor<UpdateMsg>> map : allCursors.values())
     {
       StaticUtils.close(map.values());
     }
     allCursors.clear();
     newCursors.clear();
-    resetNextChangeForInsertDBCursor();
   }
 
   private void removeCursor(final DN baseDN, final CSN csn)
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java b/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java
index f502a7c..4402947 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java
@@ -96,7 +96,15 @@
   @Override
   public boolean next() throws ChangelogException
   {
-    currentChange = cursor.next();
+    if (cursor != null)
+    {
+      currentChange = cursor.next();
+    }
+    else
+    {
+      currentChange = null;
+    }
+
 
     if (currentChange != null)
     {

--
Gitblit v1.10.0