From f3c952ca091724df572a38b5534651c515508897 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 17 Sep 2014 09:35:24 +0000
Subject: [PATCH] OPENDJ-1569 Persistent search on cn=changelog does not return updates

---
 opends/src/server/org/opends/server/backends/ChangelogBackend.java |   24 ++++++++++++++++--------
 1 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/ChangelogBackend.java b/opends/src/server/org/opends/server/backends/ChangelogBackend.java
index 19dc4df..e4165d0 100644
--- a/opends/src/server/org/opends/server/backends/ChangelogBackend.java
+++ b/opends/src/server/org/opends/server/backends/ChangelogBackend.java
@@ -995,7 +995,7 @@
     }
     else
     {
-      entrySender = new CookieEntrySender(searchOperation);
+      entrySender = new CookieEntrySender(searchOperation, SearchPhase.INITIAL);
     }
 
     if (!sendBaseChangelogEntry(searchOperation))
@@ -1079,11 +1079,11 @@
         // so we must initialize the cookie here
         searchOp.setAttachment(COOKIE_ATTACHMENT, getNewestCookie(searchOp));
       }
-      searchOp.setAttachment(ENTRY_SENDER_ATTACHMENT, new CookieEntrySender(searchOp));
+      searchOp.setAttachment(ENTRY_SENDER_ATTACHMENT, new CookieEntrySender(searchOp, SearchPhase.PERSISTENT));
     }
     else
     {
-      searchOp.setAttachment(ENTRY_SENDER_ATTACHMENT, new ChangeNumberEntrySender(searchOp));
+      searchOp.setAttachment(ENTRY_SENDER_ATTACHMENT, new ChangeNumberEntrySender(searchOp, SearchPhase.PERSISTENT));
     }
   }
 
@@ -1137,7 +1137,7 @@
     }
     else
     {
-      entrySender = new ChangeNumberEntrySender(searchOperation);
+      entrySender = new ChangeNumberEntrySender(searchOperation, SearchPhase.INITIAL);
     }
 
     DBCursor<ChangeNumberIndexRecord> cnIndexDBCursor = null;
@@ -1685,6 +1685,11 @@
     private final Object transitioningLock = new Object();
     private volatile K lastKeySentByInitialSearch;
 
+    private SendEntryData(SearchPhase startPhase)
+    {
+      searchPhase.set(startPhase);
+    }
+
     private void finalizeInitialSearch()
     {
       searchPhase.set(SearchPhase.PERSISTENT);
@@ -1744,11 +1749,12 @@
   private static class ChangeNumberEntrySender
   {
     private final SearchOperation searchOp;
-    private final SendEntryData<Long> sendEntryData = new SendEntryData<Long>();
+    private final SendEntryData<Long> sendEntryData;
 
-    private ChangeNumberEntrySender(SearchOperation searchOp)
+    private ChangeNumberEntrySender(SearchOperation searchOp, SearchPhase startPhase)
     {
       this.searchOp = searchOp;
+      this.sendEntryData = new SendEntryData<Long>(startPhase);
     }
 
     private void finalizeInitialSearch()
@@ -1785,12 +1791,14 @@
   /** Sends entries to clients for cookie-based searches. */
   private static class CookieEntrySender {
     private final SearchOperation searchOp;
+    private final SearchPhase startPhase;
     private final ConcurrentSkipListMap<Pair<DN, Integer>, SendEntryData<CSN>> replicaIdToSendEntryData =
         new ConcurrentSkipListMap<Pair<DN, Integer>, SendEntryData<CSN>>(Pair.COMPARATOR);
 
-    private CookieEntrySender(SearchOperation searchOp)
+    private CookieEntrySender(SearchOperation searchOp, SearchPhase startPhase)
     {
       this.searchOp = searchOp;
+      this.startPhase = startPhase;
     }
 
     public void finalizeInitialSearch()
@@ -1815,7 +1823,7 @@
       SendEntryData<CSN> data = replicaIdToSendEntryData.get(replicaId);
       if (data == null)
       {
-        final SendEntryData<CSN> newData = new SendEntryData<CSN>();
+        final SendEntryData<CSN> newData = new SendEntryData<CSN>(startPhase);
         data = replicaIdToSendEntryData.putIfAbsent(replicaId, newData);
         return data == null ? newData : data;
       }

--
Gitblit v1.10.0