mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noel Rouvignac
17.35.2014 f3c952ca091724df572a38b5534651c515508897
OPENDJ-1569 Persistent search on cn=changelog does not return updates

Code was broken by the fix for OPENDJ-1541 Persistent search on cn=changelog can return duplicates.
This change introduced a search phase enum and initialized all searches to the "initial search" phase.
Current fix consist in directly initializing persistent searches with changesOnly=true to the "persistent search" phase.
1 files modified
24 ■■■■■ changed files
opends/src/server/org/opends/server/backends/ChangelogBackend.java 24 ●●●●● patch | view | raw | blame | history
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;
      }