From a10168c9109c212c5fb12d86221420a11290f0d1 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 02 Jul 2015 15:34:31 +0000
Subject: [PATCH] OPENDJ-2183 ECL: changes for new suffix are missing OPENDJ-2184 ECL: wrong number of changes after adding a new replica
---
opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/LogTest.java | 4 ++--
opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/BlockLogReaderWriterTest.java | 13 ++++++++-----
opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/LogFileTest.java | 4 ++--
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/BlockLogReader.java | 27 ++++++++-------------------
opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java | 6 +++---
5 files changed, 23 insertions(+), 31 deletions(-)
diff --git a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/BlockLogReader.java b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/BlockLogReader.java
index e1c480e..243a342 100644
--- a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/BlockLogReader.java
+++ b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/BlockLogReader.java
@@ -167,7 +167,7 @@
final long markerPosition = searchClosestBlockStartToKey(key);
if (markerPosition >= 0)
{
- return positionToKeySequentially(markerPosition, key, matchStrategy, positionStrategy);
+ return positionToKey(markerPosition, key, matchStrategy, positionStrategy);
}
return Pair.of(false, null);
}
@@ -447,8 +447,7 @@
/**
* Position before, at or after provided key, starting from provided block
- * start position and reading sequentially until key is found according to
- * matching and positioning strategies.
+ * start position and reading until key is found according to matching and positioning strategies.
*
* @param blockStartPosition
* Position of read pointer in the file, expected to be the start of
@@ -465,25 +464,20 @@
* @throws ChangelogException
* If an error occurs.
*/
- Pair<Boolean, Record<K,V>> positionToKeySequentially(final long blockStartPosition, final K key,
+ Pair<Boolean, Record<K,V>> positionToKey(final long blockStartPosition, final K key,
final KeyMatchingStrategy matchStrategy, final PositionStrategy positionStrategy) throws ChangelogException
{
Record<K,V> record = readRecord(blockStartPosition);
Record<K,V> previousRecord = null;
long previousPosition = blockStartPosition;
- boolean matchingKeyIsLowerThanAnyRecord = true;
while (record != null)
{
final int keysComparison = record.getKey().compareTo(key);
- if (keysComparison <= 0)
- {
- matchingKeyIsLowerThanAnyRecord = false;
- }
if ((keysComparison == 0 && matchStrategy == EQUAL_TO_KEY)
|| (keysComparison >= 0 && matchStrategy != EQUAL_TO_KEY))
{
- return getMatchingRecord(matchStrategy, positionStrategy, keysComparison, matchingKeyIsLowerThanAnyRecord,
- record, previousRecord, previousPosition);
+ return getMatchingRecord(
+ matchStrategy, positionStrategy, keysComparison, record, previousRecord, previousPosition);
}
previousRecord = record;
previousPosition = getFilePosition();
@@ -497,19 +491,14 @@
return Pair.of(false, null);
}
- private Pair<Boolean,Record<K,V>> getMatchingRecord(KeyMatchingStrategy matchStrategy,
- PositionStrategy positionStrategy, int keysComparison, boolean matchKeyIsLowerThanAnyRecord,
- Record<K, V> currentRecord, Record<K, V> previousRecord, long previousPosition)
- throws ChangelogException
+ private Pair<Boolean, Record<K, V>> getMatchingRecord(KeyMatchingStrategy matchStrategy,
+ PositionStrategy positionStrategy, int keysComparison, Record<K, V> currentRecord, Record<K, V> previousRecord,
+ long previousPosition) throws ChangelogException
{
Record<K, V> record = currentRecord;
if (positionStrategy == AFTER_MATCHING_KEY)
{
- if (matchStrategy == LESS_THAN_OR_EQUAL_TO_KEY && matchKeyIsLowerThanAnyRecord)
- {
- return Pair.of(false, null);
- }
if (keysComparison == 0)
{
// skip matching key
diff --git a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java
index d503cb3..90b7d8c 100644
--- a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java
+++ b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java
@@ -604,8 +604,9 @@
}
cursor = new AbortableLogCursor<K, V>(this, new InternalLogCursor<K, V>(this));
final boolean isSuccessfullyPositioned = cursor.positionTo(key, matchingStrategy, positionStrategy);
- // Allow for cursor re-initialization after exhaustion in case of GREATER_THAN_OR_EQUAL_TO_KEY strategy
- if (isSuccessfullyPositioned || matchingStrategy == GREATER_THAN_OR_EQUAL_TO_KEY)
+ // Allow for cursor re-initialization after exhaustion in case of
+ // LESS_THAN_OR_EQUAL_TO_KEY ands GREATER_THAN_OR_EQUAL_TO_KEY strategies
+ if (isSuccessfullyPositioned || matchingStrategy != EQUAL_TO_KEY)
{
registerCursor(cursor);
return cursor;
@@ -627,7 +628,6 @@
}
}
-
/**
* Returns the oldest (first) record from this log.
*
diff --git a/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/BlockLogReaderWriterTest.java b/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/BlockLogReaderWriterTest.java
index ef4a107..91238e2 100644
--- a/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/BlockLogReaderWriterTest.java
+++ b/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/BlockLogReaderWriterTest.java
@@ -37,6 +37,7 @@
import java.util.Collections;
import java.util.List;
+import org.assertj.core.api.SoftAssertions;
import org.forgerock.opendj.ldap.ByteSequenceReader;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ByteStringBuilder;
@@ -161,7 +162,7 @@
{ records(1,2,3), 3, LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, record(3), true },
{ records(1,2,3), 4, LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, record(3), true },
- { records(1,2,3), 0, LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, null, false },
+ { records(1,2,3), 0, LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, record(1), true },
{ records(1,2,3), 1, LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, record(2), true },
{ records(1,2,3), 2, LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, record(3), true },
{ records(1,2,3), 3, LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, null, true },
@@ -201,7 +202,7 @@
{ records(1,2,3,4,5,6,7,8,9,10), 10, LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, record(10), true },
{ records(1,2,3,4,5,6,7,8,9,10), 11, LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, record(10), true },
- { records(1,2,3,4,5,6,7,8,9,10), 0, LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, null, false },
+ { records(1,2,3,4,5,6,7,8,9,10), 0, LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, record(1), true },
{ records(1,2,3,4,5,6,7,8,9,10), 1, LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, record(2), true },
{ records(1,2,3,4,5,6,7,8,9,10), 5, LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, record(6), true },
{ records(1,2,3,4,5,7,8,9,10), 6, LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, record(7), true },
@@ -251,8 +252,10 @@
{
Pair<Boolean, Record<Integer, Integer>> result = reader.seekToRecord(key, matchingStrategy, positionStrategy);
- assertThat(result.getFirst()).isEqualTo(shouldBeFound);
- assertThat(result.getSecond()).isEqualTo(expectedRecord);
+ final SoftAssertions softly = new SoftAssertions();
+ softly.assertThat(result.getFirst()).isEqualTo(shouldBeFound);
+ softly.assertThat(result.getSecond()).isEqualTo(expectedRecord);
+ softly.assertAll();
}
}
@@ -389,7 +392,7 @@
{
long ts = System.nanoTime();
Pair<Boolean, Record<Integer, Integer>> result =
- reader.positionToKeySequentially(0, val, GREATER_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY);
+ reader.positionToKey(0, val, GREATER_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY);
assertThat(result.getSecond()).isEqualTo(Record.from(val, val));
long te = System.nanoTime() - ts;
if (te < minTime) minTime = te;
diff --git a/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/LogFileTest.java b/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/LogFileTest.java
index b5f93cc..7e84cc3 100644
--- a/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/LogFileTest.java
+++ b/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/LogFileTest.java
@@ -142,8 +142,8 @@
{ "key11", LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, true, 10, 10},
// key00 is a special case : position is not found but cursor is positioned on beginning
- // so it is possible to iterate on it from 2 to end
- { "key00", LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, false, 2, 10},
+ // so it is possible to iterate on it from 1 to end
+ { "key00", LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, true, 1, 10 },
{ "key02", LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, true, 3, 10},
{ "key05", LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, true, 6, 10},
{ "key050", LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, true, 6, 10},
diff --git a/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/LogTest.java b/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/LogTest.java
index a0c3109..3880ae8 100644
--- a/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/LogTest.java
+++ b/opendj-sdk/opendj-server-legacy/src/test/java/org/opends/server/replication/server/changelog/file/LogTest.java
@@ -159,7 +159,7 @@
{ "key010", EQUAL_TO_KEY, AFTER_MATCHING_KEY, -1, -1 },
{ "key011", EQUAL_TO_KEY, AFTER_MATCHING_KEY, -1, -1 },
- { "key000", LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, -1, -1 },
+ { "key000", LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, 1, 10 },
{ "key001", LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, 1, 10 },
{ "key004", LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, 4, 10 },
{ "key005", LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, 5, 10 },
@@ -169,7 +169,7 @@
{ "key010", LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, 10, 10 },
{ "key011", LESS_THAN_OR_EQUAL_TO_KEY, ON_MATCHING_KEY, 10, 10 },
- { "key000", LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, -1, -1 },
+ { "key000", LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, 1, 10 },
{ "key001", LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, 2, 10 },
{ "key004", LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, 5, 10 },
{ "key005", LESS_THAN_OR_EQUAL_TO_KEY, AFTER_MATCHING_KEY, 6, 10 },
--
Gitblit v1.10.0