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

Jean-Noel Rouvignac
30.30.2013 cc21522ea71015c75a82ebf285644fa5ff57f46a
opends/src/server/org/opends/server/replication/server/changelog/je/JEChangelogDB.java
@@ -70,6 +70,17 @@
  private final String dbDirectoryName;
  private final File dbDirectory;
  /**
   * The handler of the changelog database, the database stores the relation
   * between a change number and the associated cookie.
   * <p>
   * Guarded by cnIndexDBLock
   */
  private ChangeNumberIndexDB cnIndexDB;
  /** Used for protecting {@link ChangeNumberIndexDB} related state. */
  private final Object cnIndexDBLock = new Object();
  /** The local replication server. */
  private final ReplicationServer replicationServer;
@@ -229,10 +240,8 @@
    }
    catch (ChangelogException e)
    {
      Message message =
          ERR_COULD_NOT_READ_DB.get(this.dbDirectory.getAbsolutePath(), e
              .getLocalizedMessage());
      logError(message);
      logError(ERR_COULD_NOT_READ_DB.get(this.dbDirectory.getAbsolutePath(),
          e.getLocalizedMessage()));
    }
  }
@@ -255,10 +264,33 @@
    }
  }
  private void shutdownCNIndexDB()
  {
    synchronized (cnIndexDBLock)
    {
      if (cnIndexDB != null)
      {
        try
        {
          cnIndexDB.shutdown();
        }
        catch (ChangelogException ignored)
        {
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.WARNING, ignored);
          }
        }
      }
    }
  }
  /** {@inheritDoc} */
  @Override
  public void shutdownDB()
  {
    shutdownCNIndexDB();
    if (dbEnv != null)
    {
      dbEnv.shutdown();
@@ -267,6 +299,33 @@
  /** {@inheritDoc} */
  @Override
  public void clearCNIndexDB()
  {
    synchronized (cnIndexDBLock)
    {
      if (cnIndexDB != null)
      {
        try
        {
          cnIndexDB.clear();
        }
        catch (Exception ignored)
        {
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.WARNING, ignored);
          }
        }
        shutdownCNIndexDB();
        cnIndexDB = null;
      }
    }
  }
  /** {@inheritDoc} */
  @Override
  public void removeDB()
  {
    StaticUtils.recursiveDelete(dbDirectory);
@@ -354,6 +413,7 @@
  @Override
  public void removeDomain(DN baseDN)
  {
    // 1- clear the replica DBs
    final Map<Integer, DbHandler> domainMap = getDomainMap(baseDN);
    synchronized (domainMap)
    {
@@ -376,6 +436,26 @@
      shutdownDbHandlers(domainMap);
    }
    // 2- clear the ChangeNumber index DB
    synchronized (cnIndexDBLock)
    {
      if (cnIndexDB != null)
      {
        try
        {
          cnIndexDB.clear(baseDN);
        }
        catch (Exception ignored)
        {
          if (debugEnabled())
          {
            TRACER.debugCaught(DebugLogLevel.WARNING, ignored);
          }
        }
      }
    }
    // 3- clear the changelogstate DB
    try
    {
      dbEnv.clearGenerationId(baseDN);
@@ -446,9 +526,23 @@
  /** {@inheritDoc} */
  @Override
  public ChangeNumberIndexDB newChangeNumberIndexDB() throws ChangelogException
  public ChangeNumberIndexDB getChangeNumberIndexDB()
  {
    return new DraftCNDbHandler(replicationServer, this.dbEnv);
    synchronized (cnIndexDBLock)
    {
      if (cnIndexDB == null)
      {
        try
        {
          cnIndexDB = new DraftCNDbHandler(replicationServer, this.dbEnv);
        }
        catch (Exception e)
        {
          logError(ERR_CHANGENUMBER_DATABASE.get(e.getLocalizedMessage()));
        }
      }
      return cnIndexDB;
    }
  }
  /** {@inheritDoc} */