From ceef9042e3c54251caa60f0a86677725f1830255 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 22 Dec 2014 11:19:12 +0000
Subject: [PATCH] Fix OPENDJ-1709: Persistit: ldapsearch returns second entry twice
---
opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/Index.java | 18 ++++--------------
opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java | 22 +++-------------------
opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/VLVIndex.java | 14 +++-----------
opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java | 3 ++-
4 files changed, 12 insertions(+), 45 deletions(-)
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
index d1ddb79..b06bd13 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/persistit/PersistItStorage.java
@@ -286,7 +286,6 @@
private final class CursorImpl implements Cursor {
private final Exchange ex;
- private boolean useCurrentKeyForNext = false;
private ByteString currentKey;
private ByteString currentValue;
@@ -305,10 +304,8 @@
bytesToKey(ex.getKey(), key);
try {
ex.fetch();
- useCurrentKeyForNext = ex.getValue().isDefined();
- return useCurrentKeyForNext;
+ return ex.getValue().isDefined();
} catch (PersistitException e) {
- useCurrentKeyForNext = false;
throw new StorageRuntimeException(e);
}
}
@@ -319,15 +316,8 @@
bytesToKey(ex.getKey(), key);
try {
ex.fetch();
- if (ex.getValue().isDefined()) {
- useCurrentKeyForNext = true;
- } else {
- // provided key does not exist, look for next key
- useCurrentKeyForNext = ex.next();
- }
- return useCurrentKeyForNext;
+ return ex.getValue().isDefined() || ex.next();
} catch (PersistitException e) {
- useCurrentKeyForNext = false;
throw new StorageRuntimeException(e);
}
}
@@ -337,10 +327,8 @@
try {
clearCurrentKeyAndValue();
ex.getKey().to(Key.AFTER);
- useCurrentKeyForNext = ex.previous() && ex.getValue().isDefined();
- return useCurrentKeyForNext;
+ return ex.previous();
} catch (PersistitException e) {
- useCurrentKeyForNext = false;
throw new StorageRuntimeException(e);
}
}
@@ -348,10 +336,6 @@
@Override
public boolean next() {
clearCurrentKeyAndValue();
- if (useCurrentKeyForNext) {
- useCurrentKeyForNext = false;
- return true;
- }
try {
return ex.next();
} catch (PersistitException e) {
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java
index 8319cf8..94ff788 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java
@@ -1737,7 +1737,8 @@
boolean success = cursor.positionToKeyOrNext(startKey);
// Step forward until the key is greater than the starting value.
- while (success && ByteSequence.COMPARATOR.compare(startKey, suffix) <= 0)
+ while (success
+ && ByteSequence.COMPARATOR.compare(cursor.getKey(), suffix) <= 0)
{
success = cursor.next();
}
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/Index.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/Index.java
index 7d32ac7..a40cdaf 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/Index.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/Index.java
@@ -511,41 +511,31 @@
Cursor cursor = txn.openCursor(treeName);
try
{
- ByteSequence key = ByteString.empty();
boolean success;
// Set the lower bound if necessary.
if (lower.length() > 0)
{
// Initialize the cursor to the lower bound.
- key = lower;
- success = cursor.positionToKeyOrNext(key);
+ success = cursor.positionToKeyOrNext(lower);
// Advance past the lower bound if necessary.
if (success
&& !lowerIncluded
- && ByteSequence.COMPARATOR.compare(key, lower) == 0)
+ && ByteSequence.COMPARATOR.compare(cursor.getKey(), lower) == 0)
{
// Do not include the lower value.
success = cursor.next();
- if (success)
- {
- key = cursor.getKey();
- }
}
}
else
{
success = cursor.next();
- if (success)
- {
- key = cursor.getKey();
- }
}
if (!success)
{
// There are no values.
- return new EntryIDSet(key, null);
+ return new EntryIDSet(lowerIncluded ? lower : null, null);
}
// Step through the keys until we hit the upper bound or the last key.
@@ -560,7 +550,7 @@
break;
}
}
- EntryIDSet list = new EntryIDSet(key, cursor.getValue());
+ EntryIDSet list = new EntryIDSet(cursor.getKey(), cursor.getValue());
if (!list.isDefined())
{
// There is no point continuing.
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/VLVIndex.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/VLVIndex.java
index f8ec7e6..1735314 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/VLVIndex.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/VLVIndex.java
@@ -781,8 +781,7 @@
keyBytes.appendBERLength(vBytes.length());
vBytes.copyTo(keyBytes);
- boolean success = cursor.positionToKeyOrNext(keyBytes);
- if (success)
+ if (cursor.positionToKeyOrNext(keyBytes))
{
if(logger.isTraceEnabled())
{
@@ -814,8 +813,7 @@
includedBeforeCount++;
}
- success = cursor.previous();
- if (success)
+ if (!cursor.previous())
{
break;
}
@@ -850,13 +848,7 @@
includedAfterCount++;
}
- if(includedAfterCount >= afterCount + 1)
- {
- break;
- }
-
- success = cursor.next();
- if (success)
+ if (includedAfterCount >= afterCount + 1 || !cursor.next())
{
break;
}
--
Gitblit v1.10.0