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

Jean-Noel Rouvignac
03.12.2014 acb89043d88330d28394c2be0e689632fe1fe8ea
Other code cleanups and extracted methods.
2 files modified
212 ■■■■■ changed files
opendj3-server-dev/src/server/org/opends/server/backends/jeb/Index.java 194 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/jeb/IndexBuffer.java 18 ●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/jeb/Index.java
@@ -180,7 +180,6 @@
      // is no reason why this index can't be upgraded to trusted.
      setTrusted(null, true);
    }
  }
  /**
@@ -266,9 +265,7 @@
  private void
  deleteKey(DatabaseEntry key, ImportIDSet importIdSet,
         DatabaseEntry data) throws DatabaseException {
  private void deleteKey(DatabaseEntry key, ImportIDSet importIdSet, DatabaseEntry data) throws DatabaseException {
    final OperationStatus status = read(null, key, data, LockMode.DEFAULT);
    if(status == SUCCESS) {
      newImportIDSet.clear(false);
@@ -289,9 +286,7 @@
  }
  private void
  insertKey(DatabaseEntry key, ImportIDSet importIdSet,
         DatabaseEntry data) throws DatabaseException {
  private void insertKey(DatabaseEntry key, ImportIDSet importIdSet, DatabaseEntry data) throws DatabaseException {
    final OperationStatus status = read(null, key, data, LockMode.DEFAULT);
    if(status == OperationStatus.SUCCESS) {
      newImportIDSet.clear(false);
@@ -323,9 +318,7 @@
   * @param data Database entry to reuse for read.
   * @throws DatabaseException If a database error occurs.
   */
  public void
  insert(DatabaseEntry key, ImportIDSet importIdSet,
         DatabaseEntry data) throws DatabaseException {
  public void insert(DatabaseEntry key, ImportIDSet importIdSet, DatabaseEntry data) throws DatabaseException {
    Cursor cursor = curLocal.get();
    if(cursor == null) {
      cursor = openCursor(null, null);
@@ -345,9 +338,7 @@
   *
   * @throws DatabaseException If a database error occurs.
   */
  public void
  delete(DatabaseEntry key, ImportIDSet importIdSet,
         DatabaseEntry data) throws DatabaseException {
  public void delete(DatabaseEntry key, ImportIDSet importIdSet, DatabaseEntry data) throws DatabaseException {
    Cursor cursor = curLocal.get();
    if(cursor == null) {
      cursor = openCursor(null, null);
@@ -367,9 +358,7 @@
   * @return <CODE>True</CODE> if the insert was successful.
   * @throws DatabaseException If a database error occurs.
   */
  public synchronized
  boolean insert(ImportIDSet importIDSet, Set<byte[]> keySet,
  public synchronized boolean insert(ImportIDSet importIDSet, Set<byte[]> keySet,
                 DatabaseEntry keyData, DatabaseEntry data)
          throws DatabaseException {
    for(byte[] key : keySet) {
@@ -440,8 +429,7 @@
   * @param addedIDs the IDs to add for the key.
   * @throws DatabaseException If a database error occurs.
   */
  void updateKey(Transaction txn, DatabaseEntry key,
                 EntryIDSet deletedIDs, EntryIDSet addedIDs)
  void updateKey(Transaction txn, DatabaseEntry key, EntryIDSet deletedIDs, EntryIDSet addedIDs)
      throws DatabaseException
  {
    DatabaseEntry data = new DatabaseEntry();
@@ -493,17 +481,9 @@
      }
      else
      {
        if(deletedIDs != null && !rebuildRunning && trusted)
        if (deletedIDs != null && trusted && !rebuildRunning)
        {
          if(logger.isTraceEnabled())
          {
            StringBuilder builder = new StringBuilder();
            StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
            logger.trace("The expected key does not exist in the index %s.\nKey:%s ", name, builder);
          }
          setTrusted(txn, false);
          logger.error(ERR_JEB_INDEX_CORRUPT_REQUIRES_REBUILD, name);
          logIndexCorruptError(txn, key);
        }
        if ((rebuildRunning || trusted) && isNotNullOrEmpty(addedIDs))
@@ -531,7 +511,6 @@
    return entryIDSet == null || entryIDSet.size() == 0;
  }
  private boolean isNotNullOrEmpty(EntryIDSet entryIDSet)
  {
    return entryIDSet != null && entryIDSet.size() > 0;
@@ -547,6 +526,40 @@
    final OperationStatus status = read(txn, key, data, LockMode.RMW);
    if(status == SUCCESS)
    {
      EntryIDSet entryIDList = computeEntryIDList(key, data, deletedIDs, addedIDs);
      byte[] after = entryIDList.toDatabase();
      if (after != null)
      {
        data.setData(after);
        return put(txn, key, data);
      }
      else
      {
        // No more IDs, so remove the key. If index is not
        // trusted then this will cause all subsequent reads
        // for this key to return undefined set.
        return delete(txn, key);
      }
    }
    else
    {
      if (deletedIDs != null && trusted && !rebuildRunning)
      {
        logIndexCorruptError(txn, key);
      }
      if ((rebuildRunning || trusted) && isNotNullOrEmpty(addedIDs))
      {
        data.setData(addedIDs.toDatabase());
        return insert(txn, key, data);
      }
      return OperationStatus.SUCCESS;
    }
  }
  private EntryIDSet computeEntryIDList(DatabaseEntry key, DatabaseEntry data, EntryIDSet deletedIDs,
      EntryIDSet addedIDs)
  {
      EntryIDSet entryIDList = new EntryIDSet(key.getData(), data.getData());
      if(addedIDs != null)
      {
@@ -601,43 +614,7 @@
      {
        entryIDList.deleteAll(deletedIDs);
      }
      byte[] after = entryIDList.toDatabase();
      if (after == null)
      {
        // No more IDs, so remove the key. If index is not
        // trusted then this will cause all subsequent reads
        // for this key to return undefined set.
        return delete(txn, key);
      }
      else
      {
        data.setData(after);
        return put(txn, key, data);
      }
    }
    else
    {
      if(deletedIDs != null && !rebuildRunning && trusted)
      {
        if(logger.isTraceEnabled())
        {
          StringBuilder builder = new StringBuilder();
          StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
          logger.trace("The expected key does not exist in the index %s.\nKey:%s", name, builder);
        }
        setTrusted(txn, false);
        logger.error(ERR_JEB_INDEX_CORRUPT_REQUIRES_REBUILD, name);
      }
      if((rebuildRunning || trusted) && isNotNullOrEmpty(addedIDs))
      {
        data.setData(addedIDs.toDatabase());
        return insert(txn, key, data);
      }
      return OperationStatus.SUCCESS;
    }
    return entryIDList;
  }
  /**
@@ -686,15 +663,7 @@
      }
      else if (trusted && !rebuildRunning)
      {
        if(logger.isTraceEnabled())
        {
          StringBuilder builder = new StringBuilder();
          StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
          logger.trace("The expected key does not exist in the index %s.\nKey:%s",name, builder);
        }
        setTrusted(txn, false);
        logger.error(ERR_JEB_INDEX_CORRUPT_REQUIRES_REBUILD, name);
        logIndexCorruptError(txn, key);
      }
      // Ignore failures if rebuild is running since a empty entryIDset
      // will probably not be rebuilt.
@@ -709,13 +678,10 @@
   * @param entryID The entry ID to delete.
   * @throws DatabaseException If a database error occurs.
   */
  public
  void delete(Transaction txn, Set<byte[]> keySet, EntryID entryID)
  throws DatabaseException {
  public void delete(Transaction txn, Set<byte[]> keySet, EntryID entryID) throws DatabaseException {
    setTrusted(txn, false);
    for(byte[] key : keySet) {
       removeIDWithRMW(txn, new DatabaseEntry(key),
                       new DatabaseEntry(), entryID);
       removeIDWithRMW(txn, new DatabaseEntry(key), new DatabaseEntry(), entryID);
    }
    setTrusted(txn, true);
  }
@@ -730,51 +696,53 @@
      EntryIDSet entryIDList = new EntryIDSet(key.getData(), data.getData());
      // Ignore failures if rebuild is running since the entry ID is
      // probably already removed.
      if (!entryIDList.remove(entryID) && !rebuildRunning && trusted)
      if (!entryIDList.remove(entryID) && trusted && !rebuildRunning)
      {
        if(logger.isTraceEnabled())
        {
          StringBuilder builder = new StringBuilder();
          StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
          logger.trace("The expected entry ID does not exist in " +
                "the entry ID list for index %s.\nKey:%s", name, builder);
        }
        setTrusted(txn, false);
        logger.error(ERR_JEB_INDEX_CORRUPT_REQUIRES_REBUILD, name);
        logIndexCorruptError(txn, key,
            "The expected entry ID does not exist in the entry ID list for index %s.\nKey:%s");
      }
      else
      {
        byte[] after = entryIDList.toDatabase();
        if (after == null)
        if (after != null)
        {
          data.setData(after);
          put(txn, key, data);
        }
        else
        {
          // No more IDs, so remove the key. If index is not
          // trusted then this will cause all subsequent reads
          // for this key to return undefined set.
          delete(txn, key);
        }
        else
        {
          data.setData(after);
          put(txn, key, data);
        }
      }
    }
    else if (trusted && !rebuildRunning)
    {
      logIndexCorruptError(txn, key);
    }
    // Ignore failures if rebuild is running since a empty entryIDset
    // will probably not be rebuilt.
  }
  private void logIndexCorruptError(Transaction txn, DatabaseEntry key)
  {
    logIndexCorruptError(txn, key, "The expected key does not exist in the index %s.\nKey:%s");
  }
  private void logIndexCorruptError(Transaction txn, DatabaseEntry key, String traceMsg)
  {
      if(logger.isTraceEnabled())
      {
        StringBuilder builder = new StringBuilder();
        StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
        logger.trace("The expected key does not exist in the index %s.\nKey:%s", name, builder);
      logger.trace(traceMsg, name, builder);
      }
      setTrusted(txn, false);
      logger.error(ERR_JEB_INDEX_CORRUPT_REQUIRES_REBUILD, name);
    }
    // Ignore failures if rebuild is running since a empty entryIDset
    // will probably not be rebuilt.
  }
  /**
   * Buffered delete of a key from the JE database.
@@ -820,8 +788,7 @@
   *         undefined if the key has exceeded the entry limit.
   * @throws DatabaseException If an error occurs in the JE database.
   */
  public ConditionResult containsID(Transaction txn, DatabaseEntry key,
                                    EntryID entryID)
  public ConditionResult containsID(Transaction txn, DatabaseEntry key, EntryID entryID)
       throws DatabaseException
  {
    if(rebuildRunning)
@@ -859,8 +826,7 @@
   * @param lockMode The JE locking mode to be used for the database read.
   * @return The entry IDs indexed by this key.
   */
  public EntryIDSet readKey(DatabaseEntry key, Transaction txn,
                            LockMode lockMode)
  public EntryIDSet readKey(DatabaseEntry key, Transaction txn, LockMode lockMode)
  {
    if(rebuildRunning)
    {
@@ -899,18 +865,12 @@
   * @param txn A database transaction, or null if none is required.
   * @throws DatabaseException If an error occurs in the JE database.
   */
  public void writeKey(Transaction txn, DatabaseEntry key,
                       EntryIDSet entryIDList)
  public void writeKey(Transaction txn, DatabaseEntry key, EntryIDSet entryIDList)
       throws DatabaseException
  {
    DatabaseEntry data = new DatabaseEntry();
    byte[] after = entryIDList.toDatabase();
    if (after == null)
    {
      // No more IDs, so remove the key.
      delete(txn, key);
    }
    else
    if (after != null)
    {
      if (!entryIDList.isDefined())
      {
@@ -919,6 +879,11 @@
      data.setData(after);
      put(txn, key, data);
    }
    else
    {
      // No more IDs, so remove the key.
      delete(txn, key);
    }
  }
@@ -1109,8 +1074,7 @@
  public boolean addEntry(Transaction txn, EntryID entryID, Entry entry,
      IndexingOptions options) throws DatabaseException, DirectoryException
  {
    TreeSet<ByteString> addKeys =
        new TreeSet<ByteString>(indexer.getBSComparator());
    TreeSet<ByteString> addKeys = new TreeSet<ByteString>(indexer.getBSComparator());
    indexer.indexEntry(entry, addKeys, options);
    DatabaseEntry key = new DatabaseEntry();
opendj3-server-dev/src/server/org/opends/server/backends/jeb/IndexBuffer.java
@@ -50,10 +50,12 @@
   * The buffered records stored as a map from the record key to the
   * buffered value for that key for each index.
   */
  private final LinkedHashMap<Index, TreeMap<ByteString, BufferedIndexValues>> bufferedIndexes;
  private final LinkedHashMap<Index, TreeMap<ByteString, BufferedIndexValues>> bufferedIndexes =
      new LinkedHashMap<Index, TreeMap<ByteString, BufferedIndexValues>>();
  /** The buffered records stored as a set of buffered VLV values for each index. */
  private final LinkedHashMap<VLVIndex, BufferedVLVValues> bufferedVLVIndexes;
  private final LinkedHashMap<VLVIndex, BufferedVLVValues> bufferedVLVIndexes =
      new LinkedHashMap<VLVIndex, BufferedVLVValues>();
  /** A simple class representing a pair of added and deleted indexed IDs. */
  static class BufferedIndexValues
@@ -106,7 +108,6 @@
      }
      return false;
    }
  }
  /** A simple class representing a pair of added and deleted VLV values. */
@@ -168,8 +169,6 @@
   */
  public IndexBuffer(EntryContainer entryContainer)
  {
    bufferedIndexes = new LinkedHashMap<Index, TreeMap<ByteString, BufferedIndexValues>>();
    bufferedVLVIndexes = new LinkedHashMap<VLVIndex, BufferedVLVValues>();
    this.entryContainer = entryContainer;
  }
@@ -265,17 +264,18 @@
  }
  private void updateKeys(Index index, Transaction txn, DatabaseEntry key,
      NavigableMap<ByteString, BufferedIndexValues> bufferedValues)
      Map<ByteString, BufferedIndexValues> bufferedValues)
  {
    if (bufferedValues != null)
    {
      final Iterator<Map.Entry<ByteString, BufferedIndexValues>> it = bufferedValues.entrySet().iterator();
      while (it.hasNext())
      {
        final Map.Entry<ByteString, BufferedIndexValues> bufferedKey = it.next();
        final BufferedIndexValues values = bufferedKey.getValue();
        final Map.Entry<ByteString, BufferedIndexValues> entry = it.next();
        final ByteString bufferedKey = entry.getKey();
        final BufferedIndexValues values = entry.getValue();
        key.setData(bufferedKey.getKey().toByteArray());
        key.setData(bufferedKey.toByteArray());
        index.updateKey(txn, key, values.deletedIDs, values.addedIDs);
        it.remove();