From 8513213e8f8f1cd4d87a10b3218654c6988f5188 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 31 Mar 2015 10:00:47 +0000
Subject: [PATCH] CR-6474 OPENDJ-1711 - re-implement VLV support for pluggable backends
---
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VerifyJob.java | 162 ++++++++++++++++-------------------------------------
1 files changed, 50 insertions(+), 112 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VerifyJob.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VerifyJob.java
index f62d632..a51c8be 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VerifyJob.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VerifyJob.java
@@ -27,8 +27,9 @@
package org.opends.server.backends.pluggable;
import static org.opends.messages.JebMessages.*;
-import static org.opends.server.backends.pluggable.JebFormat.*;
import static org.opends.server.backends.pluggable.EntryIDSet.newSetFromBytes;
+import static org.opends.server.backends.pluggable.JebFormat.dnToDNKey;
+import static org.opends.server.backends.pluggable.VLVIndex.decodeEntryIDFromVLVKey;
import java.util.AbstractSet;
import java.util.ArrayList;
@@ -876,7 +877,7 @@
private void iterateVLVIndex(ReadableTransaction txn, VLVIndex vlvIndex, boolean verifyID)
throws StorageRuntimeException, DirectoryException
{
- if(vlvIndex == null)
+ if(vlvIndex == null || !verifyID)
{
return;
}
@@ -884,85 +885,43 @@
Cursor cursor = txn.openCursor(vlvIndex.getName());
try
{
- SortValues lastValues = null;
while (cursor.next())
{
ByteString key = cursor.getKey();
- ByteString value = cursor.getValue();
-
- SortValuesSet sortValuesSet = new SortValuesSet(key, value, vlvIndex);
- for(int i = 0; i < sortValuesSet.getEntryIDs().length; i++)
+ EntryID id = new EntryID(decodeEntryIDFromVLVKey(key));
+ Entry entry;
+ try
{
- keyCount++;
- SortValues values = sortValuesSet.getSortValues(i);
- if(lastValues != null && lastValues.compareTo(values) >= 1)
+ entry = id2entry.get(txn, id);
+ }
+ catch (Exception e)
+ {
+ logger.traceException(e);
+ errorCount++;
+ continue;
+ }
+
+ if (entry == null)
+ {
+ errorCount++;
+ if (logger.isTraceEnabled())
{
- // Make sure the values is larger then the previous one.
- if(logger.isTraceEnabled())
- {
- logger.trace("Values %s and %s are incorrectly ordered",
- lastValues, values, keyDump(vlvIndex,
- sortValuesSet.getKeySortValues()));
- }
- errorCount++;
+ logger.trace("Reference to unknown entry ID %s%n%s", id, keyDump(vlvIndex.toString(), key));
}
- if (i == sortValuesSet.getEntryIDs().length - 1 && key.length() != 0)
+ continue;
+ }
+
+ ByteString expectedKey = vlvIndex.encodeVLVKey(entry, id.longValue());
+ if (expectedKey.compareTo(key) != 0)
+ {
+ errorCount++;
+ if (logger.isTraceEnabled())
{
- // If this is the last one in a bounded set, make sure it is the
- // same as the database key.
- ByteString encodedKey = vlvIndex.encodeKey(values);
- if (!key.equals(encodedKey))
- {
- if(logger.isTraceEnabled())
- {
- logger.trace("Incorrect key for SortValuesSet in VLV " +
- "index %s. Last values bytes %s, Key bytes %s",
- vlvIndex.getName(), encodedKey, key);
- }
- errorCount++;
- }
- }
- lastValues = values;
-
- if(verifyID)
- {
- Entry entry;
- EntryID id = new EntryID(values.getEntryID());
- try
- {
- entry = id2entry.get(txn, id);
- }
- catch (Exception e)
- {
- logger.traceException(e);
- errorCount++;
- continue;
- }
-
- if (entry == null)
- {
- errorCount++;
- if (logger.isTraceEnabled())
- {
- logger.trace("Reference to unknown ID %d%n%s",
- id, keyDump(vlvIndex, sortValuesSet.getKeySortValues()));
- }
- continue;
- }
-
- SortValues entryValues = new SortValues(id, entry, vlvIndex.getSortOrder());
- if(entryValues.compareTo(values) != 0)
- {
- errorCount++;
- if(logger.isTraceEnabled())
- {
- logger.trace("Reference to entry ID %d " +
- "which does not match the values%n%s",
- id, keyDump(vlvIndex, sortValuesSet.getKeySortValues()));
- }
- }
+ logger.trace("Reference to entry ID %s has a key which does not match the expected key%n%s",
+ id, keyDump(vlvIndex.toString(), expectedKey));
}
}
+
}
}
finally
@@ -1008,7 +967,7 @@
logger.traceException(e);
logger.trace("Malformed ID list: %s%n%s",
- StaticUtils.bytesToHex(value), keyDump(index, key));
+ StaticUtils.bytesToHex(value), keyDump(index.toString(), key));
}
continue;
}
@@ -1023,7 +982,10 @@
{
if (prevID != null && id.equals(prevID) && logger.isTraceEnabled())
{
- logger.trace("Duplicate reference to ID %d%n%s", id, keyDump(index, key));
+ if (logger.isTraceEnabled())
+ {
+ logger.trace("Duplicate reference to ID %d%n%s", id, keyDump(index.toString(), key));
+ }
}
prevID = id;
@@ -1044,7 +1006,7 @@
errorCount++;
if (logger.isTraceEnabled())
{
- logger.trace("Reference to unknown ID %d%n%s", id, keyDump(index, key));
+ logger.trace("Reference to unknown ID %d%n%s", id, keyDump(index.toString(), key));
}
continue;
}
@@ -1096,9 +1058,8 @@
errorCount++;
if (logger.isTraceEnabled())
{
- logger.trace("Reference to entry "
- + "<%s> which does not match the value%n%s",
- entry.getName(), keyDump(index, key));
+ logger.trace("Reference to entry <%s> which does not match the value%n%s",
+ entry.getName(), keyDump(index.toString(), key));
}
}
}
@@ -1337,17 +1298,17 @@
/**
* Construct a printable string from a raw key value.
*
- * @param index
- * The index database containing the key value.
+ * @param indexName
+ * The name of the index database containing the key value.
* @param key
* The bytes of the key.
* @return A string that may be logged or printed.
*/
- private String keyDump(Index index, ByteSequence key)
+ private String keyDump(String indexName, ByteSequence key)
{
StringBuilder buffer = new StringBuilder(128);
- buffer.append("File: ");
- buffer.append(index);
+ buffer.append("Index: ");
+ buffer.append(indexName);
buffer.append(ServerConstants.EOL);
buffer.append("Key:");
buffer.append(ServerConstants.EOL);
@@ -1356,35 +1317,12 @@
}
/**
- * Construct a printable string from a raw key value.
- *
- * @param vlvIndex The vlvIndex database containing the key value.
- * @param keySortValues THe sort values that is being used as the key.
- * @return A string that may be logged or printed.
- */
- private String keyDump(VLVIndex vlvIndex, SortValues keySortValues)
- {
- StringBuilder buffer = new StringBuilder(128);
- buffer.append("File: ");
- buffer.append(vlvIndex);
- buffer.append(ServerConstants.EOL);
- buffer.append("Key (last sort values):");
- if(keySortValues != null)
- {
- buffer.append(keySortValues);
- }
- else
- {
- buffer.append("UNBOUNDED (0x00)");
- }
- return buffer.toString();
- }
-
- /**
* Check that an attribute index is complete for a given entry.
*
- * @param entryID The entry ID.
- * @param entry The entry to be checked.
+ * @param entryID
+ * The entry ID.
+ * @param entry
+ * The entry to be checked.
*/
private void verifyIndex(ReadableTransaction txn, EntryID entryID, Entry entry)
{
@@ -1520,7 +1458,7 @@
{
if (logger.isTraceEnabled())
{
- logger.trace("Missing ID %d%n%s", entryID, keyDump(index, key));
+ logger.trace("Missing ID %d%n%s", entryID, keyDump(index.toString(), key));
}
errorCount++;
}
@@ -1535,7 +1473,7 @@
{
logger.traceException(e);
- logger.trace("Error reading database: %s%n%s", e.getMessage(), keyDump(index, key));
+ logger.trace("Error reading database: %s%n%s", e.getMessage(), keyDump(index.toString(), key));
}
errorCount++;
}
--
Gitblit v1.10.0