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

Jean-Noel Rouvignac
21.25.2015 167b0dde925af61a07bed4ce3cc30def39a802b9
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VerifyJob.java
@@ -29,6 +29,7 @@
import static org.opends.messages.BackendMessages.*;
import static org.opends.server.backends.pluggable.DnKeyFormat.*;
import static org.opends.server.backends.pluggable.VLVIndex.*;
import static org.opends.server.util.StaticUtils.*;
import java.util.AbstractSet;
import java.util.ArrayList;
@@ -89,12 +90,8 @@
  /** The maximum number of references per record. */
  private long maxEntryPerValue;
  /**
   * This map is used to gather some statistics about values that have
   * exceeded the entry limit.
   */
  private IdentityHashMap<Index, HashMap<ByteString, Long>> entryLimitMap =
       new IdentityHashMap<Index, HashMap<ByteString, Long>>();
  /** This map is used to gather some statistics about values that have exceeded the entry limit. */
  private IdentityHashMap<Index, HashMap<ByteString, Long>> entryLimitMap = new IdentityHashMap<>();
  /** Indicates whether dn2id is to be verified. */
  private boolean verifyDN2ID;
@@ -109,13 +106,14 @@
  private ID2Count id2childrenCount;
  /** A list of the attribute indexes to be verified. */
  private final ArrayList<AttributeIndex> attrIndexList = new ArrayList<AttributeIndex>();
  private final ArrayList<AttributeIndex> attrIndexList = new ArrayList<>();
  /** A list of the VLV indexes to be verified. */
  private final ArrayList<VLVIndex> vlvIndexList = new ArrayList<VLVIndex>();
  private final ArrayList<VLVIndex> vlvIndexList = new ArrayList<>();
  /**
   * Construct a VerifyJob.
   *
   * @param rootContainer The root container.
   * @param verifyConfig The verify configuration.
   */
  VerifyJob(RootContainer rootContainer, VerifyConfig verifyConfig)
@@ -132,8 +130,7 @@
   * @throws StorageRuntimeException If an error occurs in the storage.
   * @throws DirectoryException If an error occurs while verifying the backend.
   */
  long verifyBackend() throws StorageRuntimeException,
      DirectoryException
  long verifyBackend() throws StorageRuntimeException, DirectoryException
  {
    try
    {
@@ -158,8 +155,7 @@
  private long verifyBackend0(ReadableTransaction txn) throws StorageRuntimeException, DirectoryException
  {
    EntryContainer entryContainer =
        rootContainer.getEntryContainer(verifyConfig.getBaseDN());
    EntryContainer entryContainer = rootContainer.getEntryContainer(verifyConfig.getBaseDN());
    entryContainer.sharedLock.lock();
    try
@@ -205,8 +201,7 @@
              throw new StorageRuntimeException(ERR_VLV_INDEX_NOT_CONFIGURED.get(lowerName).toString());
            }
            VLVIndex vlvIndex =
                entryContainer.getVLVIndex(lowerName.substring(4));
            VLVIndex vlvIndex = entryContainer.getVLVIndex(lowerName.substring(4));
            if(vlvIndex == null)
            {
              throw new StorageRuntimeException(ERR_VLV_INDEX_NOT_CONFIGURED.get(lowerName.substring(4)).toString());
@@ -231,7 +226,7 @@
        }
      }
      entryLimitMap = new IdentityHashMap<Index, HashMap<ByteString, Long>>(attrIndexList.size());
      entryLimitMap = new IdentityHashMap<>(attrIndexList.size());
      // We will be updating these files independently of the indexes
      // so we need direct access to them rather than going through
@@ -426,7 +421,7 @@
    {
      iterateID2ChildrenCount(txn);
    }
    else if (attrIndexList.size() > 0)
    else if (!attrIndexList.isEmpty())
    {
      AttributeIndex attrIndex = attrIndexList.get(0);
      for (MatchingRuleIndex index : attrIndex.getNameToIndexes().values())
@@ -434,7 +429,7 @@
        iterateAttrIndex(txn, index);
      }
    }
    else if (vlvIndexList.size() > 0)
    else if (!vlvIndexList.isEmpty())
    {
      iterateVLVIndex(txn, vlvIndexList.get(0), true);
    }
@@ -541,7 +536,7 @@
    EntryID currentEntryID = new EntryID(-1);
    while(cursor.next()) {
      if (cursor.getKey().equals(currentEntryID)) {
        /** Sharded cursor may return the same EntryID multiple times */
        // Sharded cursor may return the same EntryID multiple times
        continue;
      }
      currentEntryID = cursor.getKey();
@@ -565,7 +560,7 @@
    HashMap<ByteString,Long> hashMap = entryLimitMap.get(index);
    if (hashMap == null)
    {
      hashMap = new HashMap<ByteString, Long>();
      hashMap = new HashMap<>();
      entryLimitMap.put(index, hashMap);
    }
    Long counter = hashMap.get(key);
@@ -648,7 +643,7 @@
          continue;
        }
        ByteString expectedKey = vlvIndex.encodeVLVKey(entry, id.longValue());
        ByteString expectedKey = vlvIndex.toKey(entry, id);
        if (expectedKey.compareTo(key) != 0)
        {
          errorCount++;
@@ -658,7 +653,6 @@
                id, keyDump(vlvIndex.toString(), expectedKey));
          }
        }
      }
    }
  }
@@ -707,10 +701,7 @@
          {
            if (prevID != null && id.equals(prevID) && logger.isTraceEnabled())
            {
              if (logger.isTraceEnabled())
              {
                logger.trace("Duplicate reference to ID %d%n%s", id, keyDump(index.toString(), key));
              }
              logger.trace("Duplicate reference to ID %d%n%s", id, keyDump(index.toString(), key));
            }
            prevID = id;
@@ -889,11 +880,8 @@
  private static String keyDump(String indexName, ByteSequence key)
  {
    StringBuilder buffer = new StringBuilder(128);
    buffer.append("Index: ");
    buffer.append(indexName);
    buffer.append(ServerConstants.EOL);
    buffer.append("Key:");
    buffer.append(ServerConstants.EOL);
    buffer.append("Index: ").append(indexName).append(ServerConstants.EOL);
    buffer.append("Key:").append(ServerConstants.EOL);
    StaticUtils.byteArrayToHexPlusAscii(buffer, key.toByteArray(), 6);
    return buffer.toString();
  }
@@ -949,9 +937,7 @@
    }
  }
  /**
   * Check that an attribute index is complete for a given attribute.
   */
  /** Check that an attribute index is complete for a given attribute. */
  private void verifyAttribute(ReadableTransaction txn, EntryID entryID, Entry entry, AttributeIndex attrIndex)
  {
    for (MatchingRuleIndex index : attrIndex.getNameToIndexes().values())
@@ -1019,9 +1005,7 @@
    return dn.getParentDNInSuffix();
  }
  /**
   * This class maintain the number of children for a given dn
   */
  /** This class maintain the number of children for a given dn. */
  private static final class ChildrenCount {
    private final ByteString baseDN;
    private final EntryID entryID;
@@ -1038,23 +1022,12 @@
  {
    /** The total number of records to process. */
    private long totalCount;
    /**
     * The number of records that had been processed at the time of the
     * previous progress report.
     */
    /** The number of records that had been processed at the time of the previous progress report. */
    private long previousCount;
    /** The time in milliseconds of the previous progress report. */
    private long previousTime;
    /**
     * The number of bytes in a megabyte.
     * Note that 1024*1024 bytes may eventually become known as a mebibyte(MiB).
     */
    private static final int bytesPerMegabyte = 1024*1024;
    /**
     * Create a new verify progress task.
     * @param indexIterator boolean, indicates if the task is iterating
     * through indexes or the entries.
@@ -1124,7 +1097,7 @@
      try
      {
        Runtime runtime = Runtime.getRuntime();
        long freeMemory = runtime.freeMemory() / bytesPerMegabyte;
        long freeMemory = runtime.freeMemory() / MB;
        // FIXME JNR compute the cache miss rate
        float cacheMissRate = 0;
@@ -1136,7 +1109,6 @@
        logger.traceException(e);
      }
      previousCount = latestCount;
      previousTime = latestTime;
    }