From 65c4b9f6eef396deec7aa3f0c335f9ef1b9099ce Mon Sep 17 00:00:00 2001
From: Fabio Pistolesi <fabio.pistolesi@forgerock.com>
Date: Thu, 09 Jul 2015 16:37:07 +0000
Subject: [PATCH] OPENDJ-2171 CR-7414 import-ldif in append mode should not reset index state
---
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Suffix.java | 53 +++++-
opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/EntryContainer.java | 9 -
opendj-server-legacy/src/messages/org/opends/messages/backend.properties | 4
opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java | 104 +++++++++-----
opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Suffix.java | 131 +++++++++++++++---
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java | 10 -
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeStorageImporter.java | 14 +
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeBufferImporter.java | 49 ++++--
8 files changed, 257 insertions(+), 117 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/EntryContainer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/EntryContainer.java
index 58220f8..215c9e3 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/EntryContainer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/EntryContainer.java
@@ -607,15 +607,6 @@
}
/**
- * Return attribute index map.
- *
- * @return The attribute index map.
- */
- public Map<AttributeType, AttributeIndex> getAttributeIndexMap() {
- return attrIndexMap;
- }
-
- /**
* Look for an VLV index for the given index name.
*
* @param vlvIndexName The vlv index name for which an vlv index is needed.
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
index 5d65d8b..8e7decf 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Importer.java
@@ -246,7 +246,7 @@
/** Map of container ids to database containers. */
private final ConcurrentHashMap<Integer, Index> idContainerMap = new ConcurrentHashMap<>();
/** Map of container ids to entry containers. */
- private final ConcurrentHashMap<Integer, EntryContainer> idECMap = new ConcurrentHashMap<>();
+ private final ConcurrentHashMap<Integer, Suffix> idSuffixMap = new ConcurrentHashMap<>();
/** Used to synchronize when a scratch file index writer is first setup. */
private final Object synObj = new Object();
@@ -670,7 +670,6 @@
if (suffix != null)
{
dnSuffixMap.put(ec.getBaseDN(), suffix);
- generateIndexID(suffix);
}
}
}
@@ -681,7 +680,7 @@
*/
private void generateIndexID(Suffix suffix)
{
- for (AttributeIndex attributeIndex : suffix.getAttrIndexMap().values())
+ for (AttributeIndex attributeIndex : suffix.getAttributeIndexes())
{
for(Index index : attributeIndex.getAllIndexes()) {
putInIdContainerMap(index);
@@ -904,7 +903,7 @@
logger.info(NOTE_IMPORT_STARTING, DirectoryServer.getVersionString(), BUILD_ID, REVISION_NUMBER);
logger.info(NOTE_IMPORT_THREAD_COUNT, threadCount);
initializeSuffixes();
- setIndexesTrusted(false);
+ setupIndexesForImport();
final long startTime = System.currentTimeMillis();
phaseOne();
@@ -928,7 +927,7 @@
}
final long phaseTwoFinishTime = System.currentTimeMillis();
- setIndexesTrusted(true);
+ setIndexesTrusted();
switchEntryContainers();
recursiveDelete(tempDir);
final long finishTime = System.currentTimeMillis();
@@ -1011,13 +1010,13 @@
}
}
- private void setIndexesTrusted(boolean trusted) throws JebException
+ private void setIndexesTrusted() throws JebException
{
try
{
for (Suffix s : dnSuffixMap.values())
{
- s.setIndexesTrusted(trusted);
+ s.setIndexesTrusted();
}
}
catch (DatabaseException ex)
@@ -1026,6 +1025,15 @@
}
}
+ private void setupIndexesForImport()
+ {
+ for (Suffix s : dnSuffixMap.values())
+ {
+ s.setIndexesNotTrusted(importConfiguration.appendToExistingData());
+ generateIndexID(s);
+ }
+ }
+
private void phaseOne() throws InterruptedException, ExecutionException
{
initializeIndexBuffers();
@@ -1459,10 +1467,9 @@
void processAllIndexes(Suffix suffix, Entry entry, EntryID entryID)
throws DatabaseException, DirectoryException, JebException, InterruptedException
{
- for (Map.Entry<AttributeType, AttributeIndex> mapEntry : suffix.getAttrIndexMap().entrySet())
+ for (AttributeIndex attrIndex : suffix.getAttributeIndexes())
{
- AttributeType attributeType = mapEntry.getKey();
- fillIndexKey(suffix, mapEntry.getValue(), entry, attributeType, entryID);
+ fillIndexKey(suffix, attrIndex, entry, attrIndex.getAttributeType(), entryID);
}
}
@@ -1585,12 +1592,12 @@
void processIndexes(Suffix suffix, Entry entry, EntryID entryID)
throws DatabaseException, DirectoryException, JebException, InterruptedException
{
- for (Map.Entry<AttributeType, AttributeIndex> mapEntry : suffix.getAttrIndexMap().entrySet())
+ for (AttributeIndex attrIndex : suffix.getAttributeIndexes())
{
- AttributeType attributeType = mapEntry.getKey();
+ AttributeType attributeType = attrIndex.getAttributeType();
if (entry.hasAttribute(attributeType))
{
- fillIndexKey(suffix, mapEntry.getValue(), entry, attributeType, entryID);
+ fillIndexKey(suffix, attrIndex, entry, attributeType, entryID);
}
}
}
@@ -1712,7 +1719,7 @@
DN2ID dn2id = suffix.getDN2ID();
byte[] dnBytes = JebFormat.dnToDNKey(dn, suffix.getBaseDN().size());
int id = processKey(dn2id, dnBytes, entryID, dnIndexKey, true);
- idECMap.putIfAbsent(id, suffix.getEntryContainer());
+ idSuffixMap.putIfAbsent(id, suffix);
}
void processDN2URI(Suffix suffix, Entry oldEntry, Entry newEntry) throws DatabaseException
@@ -2074,7 +2081,7 @@
DNState dnState;
if (!dnStateMap.containsKey(indexID))
{
- dnState = new DNState(idECMap.get(indexID));
+ dnState = new DNState(idSuffixMap.get(indexID));
dnStateMap.put(indexID, dnState);
}
else
@@ -2107,25 +2114,32 @@
private final EntryContainer entryContainer;
private final boolean isSubordinatesEnabled;
// Fields below are only needed if the isSubordinatesEnabled boolean is true.
- private final Map<byte[], ImportIDSet> id2childTree;
- private final Map<byte[], ImportIDSet> id2subtreeTree;
- private final int childLimit, subTreeLimit;
- private final boolean childDoCount, subTreeDoCount;
+ private Map<byte[], ImportIDSet> id2childTree;
+ private Map<byte[], ImportIDSet> id2subtreeTree;
+ private int childLimit, subTreeLimit;
+ private boolean childDoCount, subTreeDoCount;
+ private boolean updateID2Children, updateID2Subtree;
- DNState(EntryContainer entryContainer)
+ DNState(Suffix suffix)
{
- this.entryContainer = entryContainer;
+ this.entryContainer = suffix.getEntryContainer();
parentIDMap = new TreeMap<>();
isSubordinatesEnabled = backendConfiguration.isSubordinateIndexesEnabled();
- Comparator<byte[]> childComparator = entryContainer.getID2Children().getComparator();
- id2childTree = new TreeMap<>(childComparator);
- childLimit = entryContainer.getID2Children().getIndexEntryLimit();
- childDoCount = isSubordinatesEnabled && entryContainer.getID2Children().getMaintainCount();
- Comparator<byte[]> subComparator = entryContainer.getID2Subtree().getComparator();
- subTreeLimit = entryContainer.getID2Subtree().getIndexEntryLimit();
- subTreeDoCount = isSubordinatesEnabled && entryContainer.getID2Subtree().getMaintainCount();
- id2subtreeTree = new TreeMap<>(subComparator);
+ if (suffix.isProcessID2Children())
+ {
+ childLimit = entryContainer.getID2Children().getIndexEntryLimit();
+ childDoCount = isSubordinatesEnabled && entryContainer.getID2Children().getMaintainCount();
+ id2childTree = new TreeMap<>(entryContainer.getID2Children().getComparator());
+ updateID2Children = true;
+ }
+ if (suffix.isProcessID2Subtree())
+ {
+ subTreeLimit = entryContainer.getID2Subtree().getIndexEntryLimit();
+ subTreeDoCount = isSubordinatesEnabled && entryContainer.getID2Subtree().getMaintainCount();
+ id2subtreeTree = new TreeMap<>(entryContainer.getID2Subtree().getComparator());
+ updateID2Subtree = true;
+ }
dnKey = new DatabaseEntry();
dnValue = new DatabaseEntry();
lastDN = ByteBuffer.allocate(BYTE_BUFFER_CAPACITY);
@@ -2343,8 +2357,14 @@
indexMgr.addTotDNCount(1);
if (isSubordinatesEnabled && parentDN != null)
{
- id2child(entryID);
- id2SubTree(entryID);
+ if (updateID2Children)
+ {
+ id2child(entryID);
+ }
+ if (updateID2Subtree)
+ {
+ id2SubTree(entryID);
+ }
}
}
@@ -2366,9 +2386,16 @@
public void flush()
{
- if (isSubordinatesEnabled) {
- flushMapToDB(id2childTree, entryContainer.getID2Children(), false);
- flushMapToDB(id2subtreeTree, entryContainer.getID2Subtree(), false);
+ if (isSubordinatesEnabled)
+ {
+ if (updateID2Children)
+ {
+ flushMapToDB(id2childTree, entryContainer.getID2Children(), false);
+ }
+ if (updateID2Subtree)
+ {
+ flushMapToDB(id2subtreeTree, entryContainer.getID2Subtree(), false);
+ }
}
}
}
@@ -3105,10 +3132,9 @@
{
// rebuildList contains the user-selected index(in USER_DEFINED mode).
final List<String> rebuildList = rebuildConfig.getRebuildList();
- for (final Map.Entry<AttributeType, AttributeIndex> mapEntry : suffix.getAttrIndexMap().entrySet())
+ for (AttributeIndex attributeIndex : entryContainer.getAttributeIndexes())
{
- final AttributeType attributeType = mapEntry.getKey();
- final AttributeIndex attributeIndex = mapEntry.getValue();
+ final AttributeType attributeType = attributeIndex.getAttributeType();
if (rebuildConfig.getRebuildMode() == RebuildMode.ALL
|| rebuildConfig.getRebuildMode() == RebuildMode.DEGRADED)
{
@@ -3204,9 +3230,7 @@
{
if (reBuildDN2ID)
{
- EntryContainer ec = suffix.getEntryContainer();
- ec.getID2Children().setTrusted(null, trusted);
- ec.getID2Subtree().setTrusted(null, trusted);
+ suffix.forceTrustedDN2IDRelated(trusted);
}
setTrusted(indexMap.values(), trusted);
if (!vlvIndexes.isEmpty())
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Suffix.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Suffix.java
index a310a81..972eedd 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Suffix.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/Suffix.java
@@ -34,7 +34,6 @@
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.opends.server.backends.jeb.Importer.DNCache;
-import org.opends.server.types.AttributeType;
import org.opends.server.types.DN;
import com.sleepycat.je.DatabaseException;
@@ -59,6 +58,9 @@
private static final int PARENT_ID_SET_SIZE = 16 * 1024;
private final ConcurrentHashMap<DN, CountDownLatch> pendingMap = new ConcurrentHashMap<>();
private final Set<DN> parentSet = new HashSet<>(PARENT_ID_SET_SIZE);
+ private final List<AttributeIndex> attributeIndexes = new ArrayList<>();
+ private final List<VLVIndex> vlvIndexes = new ArrayList<>();
+ private boolean processID2Children, processID2Subtree;
/**
* Creates a suffix instance using the specified parameters.
@@ -139,16 +141,25 @@
/**
- * Return the Attribute Type - Index map used to map an attribute type to an
- * index instance.
+ * Returns a map associating the attribute types with their corresponding attribute indexes.
+ * The map contains only trusted indexes.
*
- * @return A suffixes Attribute Type - Index map.
+ * @return a map associating the attribute types with their corresponding trusted attribute indexes.
*/
- public Map<AttributeType, AttributeIndex> getAttrIndexMap()
+ public List<AttributeIndex> getAttributeIndexes()
{
- return entryContainer.getAttributeIndexMap();
+ return attributeIndexes;
}
+ /**
+ * Returns the list of trusted VLV indexes.
+ *
+ * @return the list of trusted VLV indexes.
+ */
+ public List<VLVIndex> getVLVIndexes()
+ {
+ return vlvIndexes;
+ }
/**
* Make sure the specified parent DN is not in the pending map.
@@ -248,38 +259,114 @@
}
+ final boolean isProcessID2Children()
+ {
+ return processID2Children;
+ }
+
+ final boolean isProcessID2Subtree()
+ {
+ return processID2Subtree;
+ }
+
/**
* Sets the trusted status of all of the indexes, vlvIndexes, id2children
* and id2subtree indexes.
*
- * @param trusted True if the indexes should be trusted or false
- * otherwise.
- *
* @throws DatabaseException If an error occurred setting the indexes to
* trusted.
*/
- public void setIndexesTrusted(boolean trusted) throws DatabaseException
+ public void setIndexesTrusted() throws DatabaseException
{
- entryContainer.getID2Children().setTrusted(null,trusted);
- entryContainer.getID2Subtree().setTrusted(null, trusted);
- for (AttributeIndex attributeIndex : entryContainer.getAttributeIndexes())
+ if (processID2Children)
{
- for (Index index : attributeIndex.getAllIndexes())
- {
- setTrusted(index, trusted);
- }
+ entryContainer.getID2Children().setTrusted(null, true);
}
- for (VLVIndex vlvIdx : entryContainer.getVLVIndexes())
+ if (processID2Subtree)
{
- vlvIdx.setTrusted(null, trusted);
+ entryContainer.getID2Subtree().setTrusted(null, true);
+ }
+ for (AttributeIndex attrIndex : attributeIndexes)
+ {
+ setTrusted(attrIndex, true);
+ }
+ for (VLVIndex vlvIdx : vlvIndexes)
+ {
+ vlvIdx.setTrusted(null, true);
}
}
- private void setTrusted(Index index, boolean trusted)
+ /**
+ * Build the lists of indexes to process and set their status as not trusted.
+ * ID2Children and ID2Subtree are also considered, albeit as special cases.
+ *
+ * @param onlyDegraded
+ * true if currently untrusted indexes should be processed as well.
+ * @throws DatabaseException
+ * If an error occurred setting the indexes to trusted.
+ */
+ public void setIndexesNotTrusted(boolean onlyDegraded) throws DatabaseException
{
- if (index != null)
+ setNotTrustedDN2IDRelatedIndexes(onlyDegraded);
+ for (AttributeIndex attributeIndex : entryContainer.getAttributeIndexes())
{
- index.setTrusted(null, trusted);
+ if (!onlyDegraded || attributeIndex.isTrusted())
+ {
+ attributeIndexes.add(attributeIndex);
+ setTrusted(attributeIndex, false);
+ }
+ }
+ for (VLVIndex vlvIndex : entryContainer.getVLVIndexes())
+ {
+ if (!onlyDegraded || vlvIndex.isTrusted())
+ {
+ vlvIndex.setTrusted(null, false);
+ vlvIndexes.add(vlvIndex);
+ }
+ }
+ }
+
+ private void setNotTrustedDN2IDRelatedIndexes(boolean onlyDegraded)
+ {
+ if (setNotTrustedDN2IDRelated(entryContainer.getID2Children(), onlyDegraded))
+ {
+ processID2Children = true;
+ }
+ if (setNotTrustedDN2IDRelated(entryContainer.getID2Subtree(), onlyDegraded))
+ {
+ processID2Subtree = true;
+ }
+ }
+
+ private boolean setNotTrustedDN2IDRelated(Index auxIndex, boolean onlyDegraded)
+ {
+ if (!onlyDegraded || auxIndex.isTrusted())
+ {
+ auxIndex.setTrusted(null, false);
+ return true;
+ }
+ return false;
+ }
+
+ private void setTrusted(AttributeIndex attrIndex, boolean trusted)
+ {
+ for (Index index : attrIndex.getAllIndexes())
+ {
+ if (index != null)
+ {
+ index.setTrusted(null, trusted);
+ }
+ }
+ }
+
+ void forceTrustedDN2IDRelated(boolean trusted)
+ {
+ entryContainer.getID2Children().setTrusted(null, trusted);
+ entryContainer.getID2Subtree().setTrusted(null, trusted);
+ if (!trusted)
+ {
+ processID2Subtree = true;
+ processID2Children = true;
}
}
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
index 029d139..c944f94 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/EntryContainer.java
@@ -603,16 +603,6 @@
}
/**
- * Return attribute index map.
- *
- * @return The attribute index map.
- */
- Map<AttributeType, AttributeIndex> getAttributeIndexMap()
- {
- return attrIndexMap;
- }
-
- /**
* Look for an VLV index for the given index name.
*
* @param vlvIndexName The vlv index name for which an vlv index is needed.
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeBufferImporter.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeBufferImporter.java
index 5e486a1..b04cdca 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeBufferImporter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeBufferImporter.java
@@ -600,14 +600,13 @@
if (suffix != null)
{
dnSuffixMap.put(ec.getBaseDN(), suffix);
- generateIndexIDs(suffix);
}
}
}
private void generateIndexIDs(Suffix suffix)
{
- for (AttributeIndex attributeIndex : suffix.getAttrIndexMap().values())
+ for (AttributeIndex attributeIndex : suffix.getAttributeIndexes())
{
for (Index index : attributeIndex.getNameToIndexes().values())
{
@@ -774,7 +773,7 @@
public void run(WriteableTransaction txn) throws Exception
{
initializeSuffixes(txn);
- setIndexesTrusted(txn, false);
+ setupIndexesForImport(txn);
}
});
@@ -804,7 +803,7 @@
@Override
public void run(WriteableTransaction txn) throws Exception
{
- setIndexesTrusted(txn, true);
+ setIndexesTrusted(txn);
switchEntryContainers(txn);
}
});
@@ -859,18 +858,34 @@
}
}
- private void setIndexesTrusted(WriteableTransaction txn, boolean trusted) throws StorageRuntimeException
+ private void setIndexesTrusted(WriteableTransaction txn) throws StorageRuntimeException
{
try
{
for (Suffix s : dnSuffixMap.values())
{
- s.setIndexesTrusted(txn, trusted);
+ s.setIndexesTrusted(txn);
}
}
catch (StorageRuntimeException ex)
{
- throw new StorageRuntimeException(NOTE_IMPORT_LDIF_TRUSTED_FAILED.get(ex.getMessage()).toString());
+ throw new StorageRuntimeException(NOTE_IMPORT_LDIF_TRUSTED_FAILED.get(ex.getMessage()).toString(), ex);
+ }
+ }
+
+ private void setupIndexesForImport(WriteableTransaction txn) throws StorageRuntimeException
+ {
+ try
+ {
+ for (Suffix s : dnSuffixMap.values())
+ {
+ s.setIndexesNotTrusted(txn, importCfg.appendToExistingData());
+ generateIndexIDs(s);
+ }
+ }
+ catch (StorageRuntimeException ex)
+ {
+ throw new StorageRuntimeException(NOTE_IMPORT_LDIF_NOT_TRUSTED_FAILED.get(ex.getMessage()).toString(), ex);
}
}
@@ -897,8 +912,7 @@
execService.submit(new MigrateExistingTask(storage)).get();
final List<Callable<Void>> tasks = new ArrayList<>(threadCount);
- if (importCfg.appendToExistingData()
- && importCfg.replaceExistingEntries())
+ if (importCfg.appendToExistingData() && importCfg.replaceExistingEntries())
{
for (int i = 0; i < threadCount; i++)
{
@@ -1400,10 +1414,9 @@
void processIndexes(Suffix suffix, Entry entry, EntryID entryID, boolean allIndexes)
throws StorageRuntimeException, InterruptedException
{
- for (Map.Entry<AttributeType, AttributeIndex> mapEntry : suffix.getAttrIndexMap().entrySet())
+ for (AttributeIndex attrIndex : suffix.getAttributeIndexes())
{
- AttributeType attrType = mapEntry.getKey();
- AttributeIndex attrIndex = mapEntry.getValue();
+ AttributeType attrType = attrIndex.getAttributeType();
if (allIndexes || entry.hasAttribute(attrType))
{
for (Map.Entry<String, MatchingRuleIndex> mapEntry2 : attrIndex.getNameToIndexes().entrySet())
@@ -1421,9 +1434,8 @@
void processVLVIndexes(WriteableTransaction txn, Suffix suffix, Entry entry, EntryID entryID)
throws DirectoryException
{
- final EntryContainer entryContainer = suffix.getEntryContainer();
- final IndexBuffer buffer = new IndexBuffer(entryContainer);
- for (VLVIndex vlvIdx : entryContainer.getVLVIndexes())
+ final IndexBuffer buffer = new IndexBuffer(suffix.getEntryContainer());
+ for (VLVIndex vlvIdx : suffix.getVLVIndexes())
{
vlvIdx.addEntry(buffer, entryID, entry);
}
@@ -2619,10 +2631,9 @@
private void rebuildIndexMap(WriteableTransaction txn, boolean onlyDegraded)
{
- for (final Map.Entry<AttributeType, AttributeIndex> mapEntry : suffix.getAttrIndexMap().entrySet())
+ for (AttributeIndex attributeIndex : entryContainer.getAttributeIndexes())
{
- final AttributeType attributeType = mapEntry.getKey();
- final AttributeIndex attributeIndex = mapEntry.getValue();
+ final AttributeType attributeType = attributeIndex.getAttributeType();
if (mustRebuild(attributeType))
{
rebuildAttributeIndexes(txn, attributeIndex, attributeType, onlyDegraded);
@@ -2959,7 +2970,7 @@
throws StorageRuntimeException, DirectoryException
{
final IndexBuffer buffer = new IndexBuffer(entryContainer);
- for (VLVIndex vlvIdx : suffix.getEntryContainer().getVLVIndexes())
+ for (VLVIndex vlvIdx : suffix.getVLVIndexes())
{
vlvIdx.addEntry(buffer, entryID, entry);
}
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeStorageImporter.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeStorageImporter.java
index d4b7f06..49c764b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeStorageImporter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeStorageImporter.java
@@ -1557,7 +1557,14 @@
{
for (Suffix s : dnSuffixMap.values())
{
- s.setIndexesTrusted(txn, trusted);
+ if (trusted)
+ {
+ s.setIndexesTrusted(txn);
+ }
+ else
+ {
+ s.setIndexesNotTrusted(txn, importCfg.appendToExistingData());
+ }
}
}
catch (StorageRuntimeException ex)
@@ -2208,10 +2215,9 @@
void processIndexes(Suffix suffix, Entry entry, EntryID entryID)
throws StorageRuntimeException, InterruptedException
{
- for (Map.Entry<AttributeType, AttributeIndex> mapEntry : suffix.getAttrIndexMap().entrySet())
+ for (AttributeIndex attrIndex : suffix.getAttributeIndexes())
{
- final AttributeType attrType = mapEntry.getKey();
- final AttributeIndex attrIndex = mapEntry.getValue();
+ final AttributeType attrType = attrIndex.getAttributeType();
if (entry.hasAttribute(attrType))
{
for (MatchingRuleIndex index : attrIndex.getNameToIndexes().values())
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Suffix.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Suffix.java
index 42b2539..d762ad2 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Suffix.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Suffix.java
@@ -37,7 +37,6 @@
import org.opends.server.backends.pluggable.OnDiskMergeBufferImporter.DNCache;
import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
import org.opends.server.backends.pluggable.spi.WriteableTransaction;
-import org.opends.server.types.AttributeType;
import org.opends.server.types.DN;
/**
@@ -71,6 +70,8 @@
private static final int PARENT_ID_SET_SIZE = 16 * 1024;
private final ConcurrentHashMap<DN, CountDownLatch> pendingMap = new ConcurrentHashMap<>();
private final Set<DN> parentSet = new HashSet<>(PARENT_ID_SET_SIZE);
+ private final List<AttributeIndex> attributeIndexes = new ArrayList<>();
+ private final List<VLVIndex> vlvIndexes = new ArrayList<>();
Suffix(EntryContainer entryContainer)
{
@@ -155,9 +156,14 @@
*
* @return A suffixes Attribute Type - Index map.
*/
- Map<AttributeType, AttributeIndex> getAttrIndexMap()
+ List<AttributeIndex> getAttributeIndexes()
{
- return entryContainer.getAttributeIndexMap();
+ return attributeIndexes;
+ }
+
+ List<VLVIndex> getVLVIndexes()
+ {
+ return vlvIndexes;
}
/**
@@ -246,21 +252,44 @@
}
/**
- * Sets the trusted status of all of the indexes and vlvIndexes.
+ * Builds the lists of Attribute and VLV indexes to process, setting their status as not trusted.
*
- * @param txn a non null transaction
- * @param trusted True if the indexes should be trusted or false otherwise.
- * @throws StorageRuntimeException If an error occurred setting the indexes to trusted.
+ * @param txn
+ * a non null transaction
+ * @param OnlyCurrentlyTrusted
+ * true if currently untrusted indexes should be processed as well.
+ * @throws StorageRuntimeException
+ * If an error occurred setting the indexes to trusted.
*/
- void setIndexesTrusted(WriteableTransaction txn, boolean trusted) throws StorageRuntimeException
+ void setIndexesNotTrusted(WriteableTransaction txn, boolean onlyCurrentlyTrusted) throws StorageRuntimeException
{
- for (AttributeIndex attributeIndex : entryContainer.getAttributeIndexes())
+ for (AttributeIndex attrIndex : entryContainer.getAttributeIndexes())
{
- setTrusted(txn, attributeIndex.getNameToIndexes().values(), trusted);
+ if (!onlyCurrentlyTrusted || attrIndex.isTrusted())
+ {
+ setTrusted(txn, attrIndex.getNameToIndexes().values(), false);
+ attributeIndexes.add(attrIndex);
+ }
}
- for (VLVIndex vlvIdx : entryContainer.getVLVIndexes())
+ for (VLVIndex vlvIndex : entryContainer.getVLVIndexes())
{
- vlvIdx.setTrusted(txn, trusted);
+ if (!onlyCurrentlyTrusted || vlvIndex.isTrusted())
+ {
+ vlvIndex.setTrusted(txn, false);
+ vlvIndexes.add(vlvIndex);
+ }
+ }
+ }
+
+ void setIndexesTrusted(WriteableTransaction txn) throws StorageRuntimeException
+ {
+ for (AttributeIndex attrIndex : attributeIndexes)
+ {
+ setTrusted(txn, attrIndex.getNameToIndexes().values(), true);
+ }
+ for (VLVIndex vlvIdx : vlvIndexes)
+ {
+ vlvIdx.setTrusted(txn, true);
}
}
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/backend.properties b/opendj-server-legacy/src/messages/org/opends/messages/backend.properties
index e34e425..ef62f7c 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/backend.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/backend.properties
@@ -1338,4 +1338,6 @@
verification process can start
ERR_IMPORT_UNSUPPORTED_WITH_BRANCH_580=Import operation is not supported \
when exclude or include sub-branches have been specified
-ERR_IMPORT_UNKNOWN_SUFFIX_COMMAND_STRATEGY_581=Unknown suffix strategy while importing suffix "%s"
\ No newline at end of file
+ERR_IMPORT_UNKNOWN_SUFFIX_COMMAND_STRATEGY_581=Unknown suffix strategy while importing suffix "%s"
+NOTE_IMPORT_LDIF_NOT_TRUSTED_FAILED_582= Setting indexes to not trusted failed \
+for the following reason: %s
--
Gitblit v1.10.0