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

Jean-Noel Rouvignac
22.13.2013 67649485a8b644abfc3f0ab7890df02d6e9fe2e8
ReplicationIterator.java:
Renamed releaseCursor() to close().
Now extends Closeable.

*.java:
Consequence of the change to ReplicationIterator.

MessageHandler.java:
Removed releaseAllIterators() in favour of StaticUtils.close().

ReplicationBackend.java:
In getEntry(), used early exit.
Used StaticUtils.close().
Removed useless comments / code.
Used interfaces rather than concrete classes.
Extracted methods computeDN() and writeChangeRecord().

ReplicationServerDomain.java:
Removed sleep() replaced with StaticUtils.sleep().

StaticUtils.java:
Made close(Collection) more generic + now log exceptions happening when closing.
7 files modified
439 ■■■■■ changed files
opends/src/server/org/opends/server/replication/server/MessageHandler.java 23 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/server/ReplicationBackend.java 279 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java 11 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/server/changelog/api/ReplicationIterator.java 7 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicationIterator.java 4 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/util/StaticUtils.java 53 ●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DbHandlerTest.java 62 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/server/MessageHandler.java
@@ -42,11 +42,13 @@
import org.opends.server.replication.common.ChangeNumber;
import org.opends.server.replication.common.ServerState;
import org.opends.server.replication.protocol.UpdateMsg;
import org.opends.server.replication.server.changelog.api.*;
import org.opends.server.replication.server.changelog.api.ReplicationIterator;
import org.opends.server.replication.server.changelog.api.ReplicationIteratorComparator;
import org.opends.server.types.*;
import static org.opends.messages.ReplicationMessages.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
import static org.opends.server.util.StaticUtils.*;
/**
 * This class implements a buffering/producer/consumer mechanism of
@@ -308,7 +310,7 @@
          }
          finally
          {
            releaseAllIterators(iteratorSortedSet);
            close(iteratorSortedSet);
          }
          /*
@@ -411,7 +413,7 @@
    }
    else
    {
      iter.releaseCursor();
      close(iter);
    }
  }
@@ -461,7 +463,7 @@
            result = null;
          } finally
          {
            releaseAllIterators(iteratorSortedSet);
            close(iteratorSortedSet);
          }
        }
      }
@@ -495,24 +497,13 @@
        }
        else
        {
          iter.releaseCursor();
          close(iter);
        }
      }
    }
    return results;
  }
  private void releaseAllIterators(SortedSet<ReplicationIterator> iterators)
  {
    if (iterators != null)
    {
      for (ReplicationIterator iter : iterators)
      {
        iter.releaseCursor();
      }
    }
  }
  /**
   * Get the count of updates sent to this server.
   * @return  The count of update sent to this server.
opends/src/server/org/opends/server/replication/server/ReplicationBackend.java
@@ -27,15 +27,6 @@
 */
package org.opends.server.replication.server;
import static org.opends.messages.BackendMessages.*;
import static org.opends.messages.JebMessages.*;
import static org.opends.messages.ReplicationMessages.*;
import static org.opends.server.config.ConfigConstants.*;
import static org.opends.server.loggers.ErrorLogger.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -45,69 +36,31 @@
import org.opends.messages.Message;
import org.opends.server.admin.Configuration;
import org.opends.server.admin.server.ServerManagementContext;
import org.opends.server.admin.std.server.BackendCfg;
import org.opends.server.admin.std.server.ReplicationServerCfg;
import org.opends.server.admin.std.server.ReplicationSynchronizationProviderCfg;
import org.opends.server.admin.std.server.RootCfg;
import org.opends.server.admin.std.server.SynchronizationProviderCfg;
import org.opends.server.admin.std.server.*;
import org.opends.server.api.Backend;
import org.opends.server.api.SynchronizationProvider;
import org.opends.server.backends.jeb.BackupManager;
import org.opends.server.config.ConfigException;
import org.opends.server.core.AddOperation;
import org.opends.server.core.DeleteOperation;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.ModifyDNOperation;
import org.opends.server.core.ModifyOperation;
import org.opends.server.core.SearchOperation;
import org.opends.server.core.*;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.protocols.internal.InternalSearchOperation;
import org.opends.server.replication.common.ChangeNumber;
import org.opends.server.replication.plugin.MultimasterReplication;
import org.opends.server.replication.plugin.ReplicationServerListener;
import org.opends.server.replication.protocol.AddMsg;
import org.opends.server.replication.protocol.DeleteMsg;
import org.opends.server.replication.protocol.LDAPUpdateMsg;
import org.opends.server.replication.protocol.ModifyDNMsg;
import org.opends.server.replication.protocol.ModifyMsg;
import org.opends.server.replication.protocol.UpdateMsg;
import org.opends.server.replication.protocol.*;
import org.opends.server.replication.server.changelog.api.ReplicationIterator;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.AttributeType;
import org.opends.server.types.Attributes;
import org.opends.server.types.BackupConfig;
import org.opends.server.types.BackupDirectory;
import org.opends.server.types.ByteString;
import org.opends.server.types.CanceledOperationException;
import org.opends.server.types.ConditionResult;
import org.opends.server.types.Control;
import org.opends.server.types.DN;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DereferencePolicy;
import org.opends.server.types.Entry;
import org.opends.server.types.FilterType;
import org.opends.server.types.IndexType;
import org.opends.server.types.InitializationException;
import org.opends.server.types.LDIFExportConfig;
import org.opends.server.types.LDIFImportConfig;
import org.opends.server.types.LDIFImportResult;
import org.opends.server.types.RawAttribute;
import org.opends.server.types.RestoreConfig;
import org.opends.server.types.ResultCode;
import org.opends.server.types.SearchFilter;
import org.opends.server.types.SearchScope;
import org.opends.server.types.SearchResultEntry;
import org.opends.server.types.ObjectClass;
import org.opends.server.util.AddChangeRecordEntry;
import org.opends.server.util.DeleteChangeRecordEntry;
import org.opends.server.util.LDIFReader;
import org.opends.server.util.LDIFWriter;
import org.opends.server.util.ModifyChangeRecordEntry;
import org.opends.server.util.ModifyDNChangeRecordEntry;
import org.opends.server.util.Validator;
import org.opends.server.types.*;
import org.opends.server.util.*;
import static org.opends.messages.BackendMessages.*;
import static org.opends.messages.JebMessages.*;
import static org.opends.messages.ReplicationMessages.*;
import static org.opends.server.config.ConfigConstants.*;
import static org.opends.server.loggers.ErrorLogger.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
/**
 * This class defines a backend that stores its information in an
@@ -370,35 +323,33 @@
  @Override()
  public synchronized Entry getEntry(DN entryDN)
  {
    Entry e = null;
    try {
      if(baseDNSet.contains(entryDN)) {
      if (baseDNSet.contains(entryDN)) {
           return new Entry(entryDN, rootObjectclasses, attributes,
                            operationalAttributes);
      } else {
        InternalClientConnection conn =
                InternalClientConnection.getRootConnection();
        SearchFilter filter=
                SearchFilter.createFilterFromString("(changetype=*)");
        InternalSearchOperation searchOperation =
                new InternalSearchOperation(conn,
                        InternalClientConnection.nextOperationID(),
                        InternalClientConnection.nextMessageID(), null, entryDN,
                        SearchScope.BASE_OBJECT,
                        DereferencePolicy.NEVER_DEREF_ALIASES, 0, 0, false,
                        filter, null, null);
        search(searchOperation);
        LinkedList<SearchResultEntry> resultEntries =
                searchOperation.getSearchEntries();
        if(resultEntries.size() != 0) {
          e=resultEntries.getFirst();
        }
      }
    } catch (DirectoryException ex) {
      e=null;
    }
    return e;
      InternalClientConnection conn =
          InternalClientConnection.getRootConnection();
      SearchFilter filter =
          SearchFilter.createFilterFromString("(changetype=*)");
      InternalSearchOperation searchOp = new InternalSearchOperation(conn,
              InternalClientConnection.nextOperationID(),
              InternalClientConnection.nextMessageID(),
              null, entryDN, SearchScope.BASE_OBJECT,
              DereferencePolicy.NEVER_DEREF_ALIASES, 0, 0, false,
              filter, null, null);
      search(searchOp);
      List<SearchResultEntry> resultEntries = searchOp.getSearchEntries();
      if (resultEntries.size() != 0)
      {
        return resultEntries.get(0);
      }
    }
    catch (DirectoryException ignored)
    {
    }
    return null;
  }
@@ -547,9 +498,9 @@
    exportRootChanges(exportContainers, exportConfig, ldifWriter);
    // Iterate through the containers.
    try
    {
      // Iterate through the containers.
      for (ReplicationServerDomain exportContainer : exportContainers)
      {
        if (exportConfig.isCancelled())
@@ -563,18 +514,7 @@
    {
      timer.cancel();
      // Close the LDIF writer
      try
      {
        ldifWriter.close();
      }
      catch (Exception e)
      {
        if (debugEnabled())
        {
          TRACER.debugCaught(DebugLogLevel.ERROR, e);
        }
      }
      close(ldifWriter);
    }
    long finishTime = System.currentTimeMillis();
@@ -628,7 +568,7 @@
   * Exports the root changes of the export, and one entry by domain.
   */
  private void exportRootChanges(List<ReplicationServerDomain> exportContainers,
      LDIFExportConfig exportConfig, LDIFWriter ldifWriter)
      final LDIFExportConfig exportConfig, LDIFWriter ldifWriter)
  {
    AttributeType ocType = DirectoryServer.getObjectClassAttributeType();
    AttributeBuilder builder = new AttributeBuilder(ocType);
@@ -645,47 +585,49 @@
    try
    {
      AddChangeRecordEntry changeRecord =
        new AddChangeRecordEntry(DN.decode(BASE_DN),
                               attrs);
      ChangeRecordEntry changeRecord =
        new AddChangeRecordEntry(DN.decode(BASE_DN), attrs);
      ldifWriter.writeChangeRecord(changeRecord);
    }
    catch (Exception e) { /* do nothing */ }
    if (exportConfig == null)
    {
      return;
    }
    for (ReplicationServerDomain exportContainer : exportContainers)
    {
      if (exportConfig != null && exportConfig.isCancelled())
      if (exportConfig.isCancelled())
      {
        break;
      }
      attrs.clear();
      // TODO JNR these multiple calls to clear() are more than suspect!
      ldapAttrList.clear();
      ldapAttrList.add(ocAttr);
      attrs.put(ocType, ldapAttrList);
      TRACER.debugInfo("State=" +
          exportContainer.getDbServerState());
      Attribute stateAttr = Attributes.create("state", exportContainer
          .getDbServerState().toString());
      Attribute stateAttr = Attributes.create("state",
          exportContainer.getDbServerState().toString());
      ldapAttrList.clear();
      ldapAttrList.add(stateAttr);
      attrs.put(stateAttr.getAttributeType(), ldapAttrList);
      Attribute genidAttr = Attributes.create("generation-id", String
          .valueOf(exportContainer.getGenerationId())
          + exportContainer.getBaseDn());
      Attribute genidAttr = Attributes.create("generation-id",
          exportContainer.getGenerationId() + exportContainer.getBaseDn());
      ldapAttrList.clear();
      ldapAttrList.add(genidAttr);
      attrs.put(genidAttr.getAttributeType(), ldapAttrList);
      try
      {
        AddChangeRecordEntry changeRecord =
          new AddChangeRecordEntry(DN.decode(
              exportContainer.getBaseDn() + "," + BASE_DN),
              attrs);
        ChangeRecordEntry changeRecord = new AddChangeRecordEntry(
            DN.decode(exportContainer.getBaseDn() + "," + BASE_DN), attrs);
        ldifWriter.writeChangeRecord(changeRecord);
      }
      catch (Exception e)
@@ -709,7 +651,6 @@
      LDIFExportConfig exportConfig, LDIFWriter ldifWriter,
      SearchOperation searchOperation)
  {
    // Walk through the servers
    for (int serverId : rsd.getServers())
    {
      if (exportConfig != null && exportConfig.isCancelled())
@@ -742,7 +683,6 @@
      ReplicationIterator ri = rsd.getChangelogIterator(serverId,
          previousChangeNumber);
      if (ri != null)
      {
        try
@@ -794,7 +734,7 @@
        }
        finally
        {
          ri.releaseCursor();
          close(ri);
        }
      }
    }
@@ -815,7 +755,6 @@
      DirectoryServer.getDefaultAttributeType(CHANGE_NUMBER);
    FilterType filterType = filter.getFilterType();
    if ( (filterType.equals(FilterType.GREATER_OR_EQUAL) ||
             filterType.equals(FilterType.EQUALITY) ) &&
             filter.getAttributeType().equals(changeNumberAttrType))
@@ -904,7 +843,7 @@
          if (exportConfig != null)
          {
            AddChangeRecordEntry changeRecord =
            ChangeRecordEntry changeRecord =
              new AddChangeRecordEntry(dn, attrs);
            ldifWriter.writeChangeRecord(changeRecord);
          }
@@ -915,76 +854,31 @@
        }
        else if (msg instanceof DeleteMsg)
        {
          DeleteMsg delMsg = (DeleteMsg)msg;
          dn = computeDN(msg);
          dn = DN.decode("uuid=" + msg.getEntryUUID() + "," +
              CHANGE_NUMBER + "=" + delMsg.getChangeNumber() + "," +
              msg.getDn() +","+ BASE_DN);
          DeleteChangeRecordEntry changeRecord =
            new DeleteChangeRecordEntry(dn);
          if (exportConfig != null)
          {
            ldifWriter.writeChangeRecord(changeRecord);
          }
          else
          {
            Writer writer = new Writer();
            LDIFWriter ldifWriter2 = writer.getLDIFWriter();
            ldifWriter2.writeChangeRecord(changeRecord);
            LDIFReader reader = writer.getLDIFReader();
            entry = reader.readEntry();
          }
          ChangeRecordEntry changeRecord = new DeleteChangeRecordEntry(dn);
          entry = writeChangeRecord(exportConfig, ldifWriter, changeRecord);
        }
        else if (msg instanceof ModifyMsg)
        {
          ModifyOperation op = (ModifyOperation)msg.createOperation(conn);
          dn = DN.decode("uuid=" + msg.getEntryUUID() + "," +
              CHANGE_NUMBER + "=" + msg.getChangeNumber() + "," +
              msg.getDn() +","+ BASE_DN);
          op.setInternalOperation(true);
          ModifyChangeRecordEntry changeRecord =
          dn = computeDN(msg);
          ChangeRecordEntry changeRecord =
            new ModifyChangeRecordEntry(dn, op.getRawModifications());
          if (exportConfig != null)
          {
            ldifWriter.writeChangeRecord(changeRecord);
          }
          else
          {
            Writer writer = new Writer();
            LDIFWriter ldifWriter2 = writer.getLDIFWriter();
            ldifWriter2.writeChangeRecord(changeRecord);
            LDIFReader reader = writer.getLDIFReader();
            entry = reader.readEntry();
          }
          entry = writeChangeRecord(exportConfig, ldifWriter, changeRecord);
        }
        else if (msg instanceof ModifyDNMsg)
        {
          ModifyDNOperation op = (ModifyDNOperation)msg.createOperation(conn);
          dn = DN.decode("uuid=" + msg.getEntryUUID() + "," +
              CHANGE_NUMBER + "=" + msg.getChangeNumber() + "," +
              msg.getDn() +","+ BASE_DN);
          op.setInternalOperation(true);
          ModifyDNChangeRecordEntry changeRecord =
          dn = computeDN(msg);
          ChangeRecordEntry changeRecord =
            new ModifyDNChangeRecordEntry(dn, op.getNewRDN(), op.deleteOldRDN(),
                op.getNewSuperior());
          if (exportConfig != null)
          {
            ldifWriter.writeChangeRecord(changeRecord);
          }
          else
          {
            Writer writer = new Writer();
            LDIFWriter ldifWriter2 = writer.getLDIFWriter();
            ldifWriter2.writeChangeRecord(changeRecord);
            LDIFReader reader = writer.getLDIFReader();
            entry = reader.readEntry();
          }
          entry = writeChangeRecord(exportConfig, ldifWriter, changeRecord);
        }
        if (exportConfig != null)
@@ -1009,9 +903,8 @@
          SearchScope  scope  = searchOperation.getScope();
          SearchFilter filter = searchOperation.getFilter();
          boolean ms = entry.matchesBaseAndScope(searchBaseDN, scope);
          boolean mf = filter.matchesEntry(entry);
          if ( ms && mf )
          if (entry.matchesBaseAndScope(searchBaseDN, scope)
              && filter.matchesEntry(entry))
          {
            searchOperation.returnEntry(entry, new LinkedList<Control>());
          }
@@ -1025,7 +918,6 @@
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, e);
      }
      Message message;
      String dnStr;
      if (dn == null)
      {
@@ -1035,6 +927,7 @@
      {
        dnStr = dn.toNormalizedString();
      }
      Message message;
      if (exportConfig != null)
      {
        message = ERR_BACKEND_EXPORT_ENTRY.get(
@@ -1049,6 +942,30 @@
    }
  }
  private DN computeDN(LDAPUpdateMsg msg) throws DirectoryException
  {
    return DN.decode("uuid=" + msg.getEntryUUID() + "," + CHANGE_NUMBER + "="
        + msg.getChangeNumber() + "," + msg.getDn() + "," + BASE_DN);
  }
  private Entry writeChangeRecord(LDIFExportConfig exportConfig,
      LDIFWriter ldifWriter, ChangeRecordEntry changeRecord)
      throws IOException, LDIFException
  {
    if (exportConfig != null)
    {
      ldifWriter.writeChangeRecord(changeRecord);
      return null;
    }
    final Writer writer = new Writer();
    final LDIFWriter ldifWriter2 = writer.getLDIFWriter();
    ldifWriter2.writeChangeRecord(changeRecord);
    final LDIFReader ldifReader = writer.getLDIFReader();
    return ldifReader.readEntry();
  }
  /**
   * Add an attribute to a provided Map of attribute.
   *
@@ -1326,20 +1243,16 @@
    if (server==null)
    {
      server = getReplicationServer();
      if (server == null)
      {
        if (baseDNSet.contains(searchBaseDN))
        if (!baseDNSet.contains(searchBaseDN))
        {
          return;
        }
        else
        {
          Message message = ERR_REPLICATIONBACKEND_ENTRY_DOESNT_EXIST.
          get(String.valueOf(searchBaseDN));
          Message message = ERR_REPLICATIONBACKEND_ENTRY_DOESNT_EXIST.get(
              String.valueOf(searchBaseDN));
          throw new DirectoryException(
              ResultCode.NO_SUCH_OBJECT, message, null, null);
        }
        return;
      }
    }
opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
@@ -1311,7 +1311,7 @@
    if (!it.next())
    {
      it.releaseCursor();
      close(it);
      return null;
    }
@@ -1867,11 +1867,6 @@
    }
  }
  private void sleep(int millis)
  {
    try { Thread.sleep(millis); } catch (InterruptedException e) {}
  }
  /**
   * Creates a TopologyMsg filled with information to be sent to a remote RS.
   * We send remote RS the info of every DS that are directly connected to us
@@ -2717,9 +2712,7 @@
              // there's no change older than eligibleCN (case of s3/cn31)
              result.update(new ChangeNumber(0, 0, serverId));
            } finally {
              if (ri != null) {
                ri.releaseCursor();
              }
              close(ri);
            }
          } else {
            // for this serverId, all changes in the ChangelogDb are holder
opends/src/server/org/opends/server/replication/server/changelog/api/ReplicationIterator.java
@@ -26,13 +26,15 @@
 */
package org.opends.server.replication.server.changelog.api;
import java.io.Closeable;
import org.opends.server.replication.protocol.UpdateMsg;
/**
 * This interface allows to iterate through the changes received from a given
 * LDAP Server Identifier.
 */
public interface ReplicationIterator
public interface ReplicationIterator extends Closeable
{
  /**
@@ -55,6 +57,7 @@
   * called when the iterator is no longer used. Failure to do it could cause DB
   * deadlock.
   */
  void releaseCursor();
  @Override
  void close();
}
opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicationIterator.java
@@ -133,7 +133,7 @@
  /** {@inheritDoc} */
  @Override
  public void releaseCursor()
  public void close()
  {
    synchronized (this)
    {
@@ -155,6 +155,6 @@
  @Override
  protected void finalize()
  {
    releaseCursor();
    close();
  }
}
opends/src/server/org/opends/server/util/StaticUtils.java
@@ -27,42 +27,16 @@
 */
package org.opends.server.util;
import java.io.BufferedReader;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.net.*;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.RandomAccess;
import java.util.StringTokenizer;
import java.util.TimeZone;
import java.util.*;
import javax.naming.NamingException;
import javax.naming.ldap.InitialLdapContext;
@@ -74,19 +48,7 @@
import org.opends.server.api.ClientConnection;
import org.opends.server.core.DirectoryServer;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
import org.opends.server.types.ByteSequence;
import org.opends.server.types.DN;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.Entry;
import org.opends.server.types.IdentifiedException;
import org.opends.server.types.ObjectClass;
import org.opends.server.types.RDN;
import org.opends.server.types.ResultCode;
import org.opends.server.types.*;
import org.opends.server.util.args.Argument;
import org.opends.server.util.args.ArgumentException;
@@ -4639,7 +4601,7 @@
   * @param closeables
   *          The closeables to be closed, which may be <code>null</code>.
   */
  public static void close(Collection<Closeable> closeables)
  public static void close(Collection<? extends Closeable> closeables)
  {
    if (closeables == null)
    {
@@ -4655,7 +4617,10 @@
        }
        catch (IOException ignored)
        {
          // Ignore.
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.ERROR, ignored);
          }
        }
      }
    }
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DbHandlerTest.java
@@ -41,6 +41,7 @@
import org.opends.server.replication.server.ReplServerFakeConfiguration;
import org.opends.server.replication.server.ReplicationServer;
import org.opends.server.replication.server.changelog.api.ReplicationIterator;
import org.opends.server.util.StaticUtils;
import org.testng.annotations.Test;
import static org.opends.server.TestCaseUtils.*;
@@ -86,9 +87,7 @@
      testRoot = createDirectory(path);
      dbEnv = new ReplicationDbEnv(path, replicationServer);
      handler = new DbHandler(1, TEST_ROOT_DN_STRING,
        replicationServer, dbEnv, 5000);
      handler = new DbHandler(1, TEST_ROOT_DN_STRING, replicationServer, dbEnv, 5000);
      ChangeNumberGenerator gen = new ChangeNumberGenerator( 1, 0);
      ChangeNumber changeNumber1 = gen.newChangeNumber();
@@ -182,8 +181,7 @@
  private String getReplicationDbPath()
  {
    String buildRoot = System.getProperty(TestCaseUtils.PROPERTY_BUILD_ROOT);
    String path =
        System.getProperty(TestCaseUtils.PROPERTY_BUILD_DIR, buildRoot
    String path = System.getProperty(TestCaseUtils.PROPERTY_BUILD_DIR, buildRoot
            + File.separator + "build");
    return path + File.separator + "unit-tests" + File.separator + "dbHandler";
  }
@@ -199,43 +197,51 @@
    return testRoot;
  }
  private ReplicationIterator assertFoundInOrder(DbHandler handler,
  private void assertFoundInOrder(DbHandler handler,
      ChangeNumber... changeNumbers) throws Exception
  {
    if (changeNumbers.length == 0)
    {
      return null;
      return;
    }
    ReplicationIterator it = handler.generateIterator(changeNumbers[0]);
    for (int i = 1; i < changeNumbers.length; i++)
    try
    {
      assertTrue(it.next());
      final ChangeNumber cn = it.getChange().getChangeNumber();
      final boolean equals = cn.compareTo(changeNumbers[i]) == 0;
      assertTrue(equals, "Actual change number=" + cn
          + ", Expected change number=" + changeNumbers[i]);
      for (int i = 1; i < changeNumbers.length; i++)
      {
        assertTrue(it.next());
        final ChangeNumber cn = it.getChange().getChangeNumber();
        final boolean equals = cn.compareTo(changeNumbers[i]) == 0;
        assertTrue(equals, "Actual change number=" + cn
            + ", Expected change number=" + changeNumbers[i]);
      }
      assertFalse(it.next());
      assertNull(it.getChange(), "Actual change number=" + it.getChange()
          + ", Expected null");
    }
    assertFalse(it.next());
    assertNull(it.getChange(), "Actual change number=" + it.getChange()
        + ", Expected null");
    it.releaseCursor();
    return it;
    finally
    {
      StaticUtils.close(it);
    }
  }
  private void assertNotFound(DbHandler handler, ChangeNumber changeNumber)
  {
    ReplicationIterator iter = null;
    try
    {
      ReplicationIterator iter = handler.generateIterator(changeNumber);
      iter.releaseCursor();
      iter = handler.generateIterator(changeNumber);
      fail("Expected exception");
    }
    catch (Exception e)
    {
      assertEquals(e.getLocalizedMessage(), "ChangeNumber not available");
    }
    finally
    {
      StaticUtils.close(iter);
    }
  }
  /**
@@ -261,10 +267,7 @@
      testRoot = createDirectory(path);
      dbEnv = new ReplicationDbEnv(path, replicationServer);
      handler =
        new DbHandler( 1, TEST_ROOT_DN_STRING,
        replicationServer, dbEnv, 5000);
      handler = new DbHandler(1, TEST_ROOT_DN_STRING, replicationServer, dbEnv, 5000);
      // Creates changes added to the dbHandler
      ChangeNumberGenerator gen = new ChangeNumberGenerator( 1, 0);
@@ -365,10 +368,7 @@
      dbEnv = new ReplicationDbEnv(path, replicationServer);
      // Create the handler
      handler =
        new DbHandler( 1, TEST_ROOT_DN_STRING,
            replicationServer, dbEnv, 10);
      handler = new DbHandler(1, TEST_ROOT_DN_STRING, replicationServer, dbEnv, 10);
      handler.setCounterWindowSize(counterWindow);
      // Populate the db with 'max' msg
@@ -465,9 +465,7 @@
      debugInfo(tn,"SHUTDOWN handler and recreate");
      handler.shutdown();
      handler =
        new DbHandler( 1, TEST_ROOT_DN_STRING,
            replicationServer, dbEnv, 10);
      handler = new DbHandler(1, TEST_ROOT_DN_STRING, replicationServer, dbEnv, 10);
      handler.setCounterWindowSize(counterWindow);
      // Test first and last