From afa2085718b06df57bb32d2dca748012f5f55b18 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 19 Jun 2012 09:07:19 +0000
Subject: [PATCH] Fix OPENDJ-506: NoSuchElementException thrown during replication in java.util.TreeMap.key(TreeMap.java:1221)

---
 opendj-sdk/opends/src/server/org/opends/server/replication/server/MessageHandler.java |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/MessageHandler.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/MessageHandler.java
index 0f4b2bd..3791a40 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/MessageHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/MessageHandler.java
@@ -72,7 +72,9 @@
    */
   private final MsgQueue msgQueue = new MsgQueue();
   /**
-   * Late queue.
+   * Late queue. All access to the lateQueue in getNextMessage() is
+   * single-threaded. However, reads from threads calling getOlderUpdateCN()
+   * need protecting against removals performed using getNextMessage().
    */
   private final MsgQueue lateQueue = new MsgQueue();
   /**
@@ -405,7 +407,10 @@
         } else
         {
           /* get the next change from the lateQueue */
-          msg = lateQueue.removeFirst();
+          synchronized (msgQueue)
+          {
+            msg = lateQueue.removeFirst();
+          }
           this.updateServerState(msg);
           return msg;
         }

--
Gitblit v1.10.0