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

Jean-Noel Rouvignac
13.13.2015 4094ffb38e7a486dbe802ad70257c1d1613b1802
Code simplifications


Importer.java:
Renamed putInIdContainerMap() to putInIndexIDToIndexMap().
Fixed Tree parameter names.
RebuildIndexManager:
- changed dn2id and dn2uri fields to reBuildDn2id and rebuildDn2uri boolean fields.
- in setIndexesListsToBeRebuilt(), rebuildIndexMap(), clearIndexesToBeRebuilt() simplified the code\ + extracted mustRebuild() method
- in clearIndexesToBeRebuilt(), fixed a bug: it should reference the computed vlvIndexes rather than entryContainer.getVLVIndexes()
- inlined fillIndexMap() and setTrusted()
1 files modified
147 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java 147 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Importer.java
@@ -663,22 +663,19 @@
    {
      for (Index index : attributeIndex.getNameToIndexes().values())
      {
        putInIdContainerMap(index);
        putInIndexIDToIndexMap(index);
      }
    }
  }
  private void putInIdContainerMap(Index index)
  private void putInIndexIDToIndexMap(Index index)
  {
    if (index != null)
    {
      indexIDToIndexMap.putIfAbsent(getIndexID(index), index);
    }
    indexIDToIndexMap.putIfAbsent(getIndexID(index), index);
  }
  private static int getIndexID(Tree index)
  private static int getIndexID(Tree tree)
  {
    return System.identityHashCode(index);
    return System.identityHashCode(tree);
  }
  private Suffix getSuffix(WriteableTransaction txn, EntryContainer entryContainer)
@@ -1657,8 +1654,8 @@
      getAll(futures);
    }
    int processKey(Tree container, ByteString key, EntryID entryID,
        IndexKey indexKey, boolean insert) throws InterruptedException
    int processKey(Tree tree, ByteString key, EntryID entryID, IndexKey indexKey, boolean insert)
        throws InterruptedException
    {
      int sizeNeeded = IndexOutputBuffer.getRequiredSize(key.length(), entryID.longValue());
      IndexOutputBuffer indexBuffer = indexBufferMap.get(indexKey);
@@ -1675,7 +1672,7 @@
        indexBuffer = getNewIndexBuffer(sizeNeeded, indexKey);
        indexBufferMap.put(indexKey, indexBuffer);
      }
      int indexID = getIndexID(container);
      int indexID = getIndexID(tree);
      indexBuffer.add(key, entryID, indexID, insert);
      return indexID;
    }
@@ -2678,25 +2675,22 @@
  /** The rebuild index manager handles all rebuild index related processing. */
  private class RebuildIndexManager extends ImportTask
  {
    /** Rebuild index configuration. */
    private final RebuildConfig rebuildConfig;
    /** Backend configuration. */
    private final PluggableBackendCfg cfg;
    /** Map of index keys to indexes. */
    /** Map of index keys to indexes to rebuild. */
    private final Map<IndexKey, MatchingRuleIndex> indexMap = new LinkedHashMap<>();
    /** List of VLV indexes. */
    /** List of VLV indexes to rebuild. */
    private final List<VLVIndex> vlvIndexes = new LinkedList<>();
    private boolean reBuildDn2id;
    private boolean rebuildDn2uri;
    /** The suffix instance. */
    private Suffix suffix;
    /** The entry container. */
    private EntryContainer entryContainer;
    /** The DN2ID index. */
    private DN2ID dn2id;
    /** The DN2URI index. */
    private DN2URI dn2uri;
    /** Total entries to be processed. */
    private long totalEntries;
@@ -2818,7 +2812,6 @@
      setRebuildListIndexesTrusted(txn, true);
    }
    @SuppressWarnings("fallthrough")
    private void setIndexesListsToBeRebuilt(WriteableTransaction txn) throws StorageRuntimeException
    {
      // Depends on rebuild mode, (re)building indexes' lists.
@@ -2826,23 +2819,15 @@
      switch (mode)
      {
      case ALL:
        reBuildDn2id = true;
        rebuildDn2uri = true;
        rebuildIndexMap(txn, false);
        // falls through
        vlvIndexes.addAll(entryContainer.getVLVIndexes());
        break;
      case DEGRADED:
        if (mode == RebuildMode.ALL)
        {
          dn2id = entryContainer.getDN2ID();
        }
        if (mode == RebuildMode.ALL || entryContainer.getDN2URI() == null)
        {
          dn2uri = entryContainer.getDN2URI();
        }
        if (mode == RebuildMode.DEGRADED
            || entryContainer.getAttributeIndexes().isEmpty())
        {
          rebuildIndexMap(txn, true); // only degraded.
        }
        if (mode == RebuildMode.ALL || vlvIndexes.isEmpty())
        rebuildIndexMap(txn, true);
        if (vlvIndexes.isEmpty())
        {
          vlvIndexes.addAll(entryContainer.getVLVIndexes());
        }
@@ -2852,6 +2837,7 @@
        // false may be required if the user wants to rebuild specific index.
        rebuildIndexMap(txn, false);
        break;
      default:
        break;
      }
@@ -2859,29 +2845,40 @@
    private void rebuildIndexMap(WriteableTransaction txn, boolean onlyDegraded)
    {
      // rebuildList contains the user-selected index(in USER_DEFINED mode).
      final List<String> rebuildList = rebuildConfig.getRebuildList();
      final RebuildMode rebuildMode = rebuildConfig.getRebuildMode();
      for (final Map.Entry<AttributeType, AttributeIndex> mapEntry : suffix.getAttrIndexMap().entrySet())
      {
        final AttributeType attributeType = mapEntry.getKey();
        final AttributeIndex attributeIndex = mapEntry.getValue();
        if (rebuildConfig.getRebuildMode() == RebuildMode.ALL
            || rebuildConfig.getRebuildMode() == RebuildMode.DEGRADED)
        if (mustRebuild(attributeType, rebuildMode))
        {
          // Get all existing indexes for all && degraded mode.
          rebuildAttributeIndexes(txn, attributeIndex, attributeType, onlyDegraded);
        }
        else if (!rebuildList.isEmpty())
      }
    }
    private boolean mustRebuild(final AttributeType attrType, RebuildMode rebuildMode)
    {
      switch (rebuildMode)
      {
      case ALL:
      case DEGRADED:
        // Get all existing indexes
        return true;
      case USER_DEFINED:
        // Get the user selected indexes
        for (final String index : rebuildConfig.getRebuildList())
        {
          // Get indexes for user defined index.
          for (final String index : rebuildList)
          if (attrType.getNameOrOID().toLowerCase().equals(index.toLowerCase()))
          {
            if (attributeType.getNameOrOID().toLowerCase().equals(index.toLowerCase()))
            {
              rebuildAttributeIndexes(txn, attributeIndex, attributeType, onlyDegraded);
            }
            return true;
          }
        }
        return false;
      default:
        return false;
      }
    }
@@ -2890,46 +2887,41 @@
    {
      for (Map.Entry<String, MatchingRuleIndex> mapEntry : attrIndex.getNameToIndexes().entrySet())
      {
        fillIndexMap(txn, attrType, mapEntry.getValue(), mapEntry.getKey(), onlyDegraded);
      }
    }
        MatchingRuleIndex index = mapEntry.getValue();
    private void fillIndexMap(WriteableTransaction txn, AttributeType attrType, MatchingRuleIndex index,
        String importIndexID, boolean onlyDegraded)
    {
      if ((!onlyDegraded || !index.isTrusted())
          && (!rebuildConfig.isClearDegradedState() || index.getRecordCount(txn) == 0))
      {
        putInIdContainerMap(index);
        if ((!onlyDegraded || !index.isTrusted())
            && (!rebuildConfig.isClearDegradedState() || index.getRecordCount(txn) == 0))
        {
          putInIndexIDToIndexMap(index);
        final IndexKey key = new IndexKey(attrType, importIndexID, index.getIndexEntryLimit());
        indexMap.put(key, index);
          final IndexKey key = new IndexKey(attrType, mapEntry.getKey(), index.getIndexEntryLimit());
          indexMap.put(key, index);
        }
      }
    }
    private void clearIndexesToBeRebuilt(WriteableTransaction txn) throws StorageRuntimeException
    {
      if (dn2uri != null)
      if (rebuildDn2uri)
      {
        entryContainer.clearTree(txn, entryContainer.getDN2URI());
      }
      if (dn2id != null)
      if (reBuildDn2id)
      {
        entryContainer.clearTree(txn, entryContainer.getDN2ID());
        entryContainer.clearTree(txn, entryContainer.getID2ChildrenCount());
      }
      for (Map.Entry<IndexKey, MatchingRuleIndex> mapEntry : indexMap.entrySet())
      for (final Index index : indexMap.values())
      {
        final Index index = mapEntry.getValue();
        if (!index.isTrusted())
        {
          entryContainer.clearTree(txn, index);
        }
      }
      for (final VLVIndex vlvIndex : entryContainer.getVLVIndexes())
      for (final VLVIndex vlvIndex : vlvIndexes)
      {
        if (!vlvIndex.isTrusted())
        {
@@ -2942,7 +2934,10 @@
    {
      try
      {
        setTrusted(txn, indexMap.values(), trusted);
        for (Index index : indexMap.values())
        {
          index.setTrusted(txn, trusted);
        }
        for (VLVIndex vlvIndex : vlvIndexes)
        {
          vlvIndex.setTrusted(txn, trusted);
@@ -2954,17 +2949,6 @@
      }
    }
    private void setTrusted(WriteableTransaction txn, final Collection<MatchingRuleIndex> indexes, boolean trusted)
    {
      if (indexes != null && !indexes.isEmpty())
      {
        for (Index index : indexes)
        {
          index.setTrusted(txn, trusted);
        }
      }
    }
    /** @see Importer#importPhaseOne(WriteableTransaction) */
    private void rebuildIndexesPhaseOne() throws StorageRuntimeException, InterruptedException,
        ExecutionException
@@ -3186,11 +3170,11 @@
    private void processEntry(WriteableTransaction txn, Entry entry, EntryID entryID)
        throws DirectoryException, StorageRuntimeException, InterruptedException
    {
      if (dn2id != null)
      if (reBuildDn2id)
      {
        processDN2ID(suffix, entry.getName(), entryID);
      }
      if (dn2uri != null)
      if (rebuildDn2uri)
      {
        processDN2URI(txn, suffix, null, entry);
      }
@@ -3214,14 +3198,14 @@
    {
      for (Map.Entry<IndexKey, MatchingRuleIndex> mapEntry : indexMap.entrySet())
      {
        IndexKey key = mapEntry.getKey();
        AttributeType attrType = key.getAttributeType();
        IndexKey indexKey = mapEntry.getKey();
        AttributeType attrType = indexKey.getAttributeType();
        if (entry.hasAttribute(attrType))
        {
          AttributeIndex attributeIndex = entryContainer.getAttributeIndex(attrType);
          IndexingOptions options = attributeIndex.getIndexingOptions();
          MatchingRuleIndex index = mapEntry.getValue();
          processAttribute(index, entry, entryID, options, key);
          processAttribute(index, entry, entryID, options, indexKey);
        }
      }
    }
@@ -3441,9 +3425,8 @@
   * elements into a single queue and/or maps based on both attribute type and index ID (ie.,
   * cn.equality, sn.equality,...).
   */
  public static class IndexKey
  static class IndexKey
  {
    private final AttributeType attributeType;
    private final String indexID;
    private final int entryLimit;