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

Nicolas Capponi
05.22.2015 caa4de0dcfdb41b26fbff20936ac0ef49bab95cc
OPENDJ-2086 ConcurrentModificationException in file based changelog

Use lock in Log.findBoundaryKeyFromRecord() to prevent concurrent
modification
1 files modified
28 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java 28 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/replication/server/changelog/file/Log.java
@@ -434,8 +434,8 @@
      }
      LogFile<K, V> headLogFile = getHeadLogFile();
      if (mustRotate(headLogFile))
      {
        logger.info(INFO_CHANGELOG_LOG_FILE_ROTATION.get(logPath.getPath(), headLogFile.getSizeInBytes()));
      {
        logger.debug(INFO_CHANGELOG_LOG_FILE_ROTATION.get(logPath.getPath(), headLogFile.getSizeInBytes()));
        rotateHeadLogFile();
        headLogFile = getHeadLogFile();
@@ -853,18 +853,26 @@
  <V2 extends Comparable<V2>> K findBoundaryKeyFromRecord(Record.Mapper<V, V2> mapper, V2 limitValue)
      throws ChangelogException
  {
    K key = null;
    for (LogFile<K, V> logFile : logFiles.values())
    sharedLock.lock();
    try
    {
      final Record<K, V> record = logFile.getOldestRecord();
      final V2 oldestValue = mapper.map(record.getValue());
      if (oldestValue.compareTo(limitValue) > 0)
      K key = null;
      for (LogFile<K, V> logFile : logFiles.values())
      {
        return key;
        final Record<K, V> record = logFile.getOldestRecord();
        final V2 oldestValue = mapper.map(record.getValue());
        if (oldestValue.compareTo(limitValue) > 0)
        {
          return key;
        }
        key = record.getKey();
      }
      key = record.getKey();
      return key;
    }
    return key;
    finally
    {
      sharedLock.unlock();
    }
  }
  /** Effectively close this log. */