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