From 9df25e0038ce8fff0315844e07683c2ce7934c0c Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 18 Feb 2015 17:24:21 +0000
Subject: [PATCH] OPENDJ-1708 Persistit: no rebuild-index support

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java |   61 ++++++++++++++++++++++++++++++
 1 files changed, 61 insertions(+), 0 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java
index 77c929a..4ca4025 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java
@@ -35,6 +35,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.forgerock.i18n.LocalizableMessage;
@@ -46,11 +47,13 @@
 import org.forgerock.util.Reject;
 import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.std.meta.BackendIndexCfgDefn;
+import org.opends.server.admin.std.server.PersistitBackendCfg;
 import org.opends.server.admin.std.server.PluggableBackendCfg;
 import org.opends.server.api.AlertGenerator;
 import org.opends.server.api.Backend;
 import org.opends.server.api.DiskSpaceMonitorHandler;
 import org.opends.server.api.MonitorProvider;
+import org.opends.server.backends.RebuildConfig;
 import org.opends.server.backends.VerifyConfig;
 import org.opends.server.backends.pluggable.spi.Storage;
 import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
@@ -733,6 +736,64 @@
     }
   }
 
+  /** {@inheritDoc} */
+  @Override
+  public void rebuildBackend(RebuildConfig rebuildConfig)
+      throws InitializationException, ConfigException, DirectoryException
+  {
+    // If the backend already has the root container open, we must use the same
+    // underlying root container
+    boolean openRootContainer = mustOpenRootContainer();
+
+    /*
+     * If the rootContainer is open, the backend is initialized by something else.
+     * We can't do any rebuild of system indexes while others are using this backend.
+     */
+    final ResultCode errorRC = DirectoryServer.getServerErrorResultCode();
+    if (!openRootContainer && rebuildConfig.includesSystemIndex())
+    {
+      throw new DirectoryException(errorRC, ERR_JEB_REBUILD_BACKEND_ONLINE.get());
+    }
+
+    try
+    {
+      if (openRootContainer)
+      {
+        rootContainer = initializeRootContainer();
+      }
+      final Importer importer = new Importer(rebuildConfig, (PersistitBackendCfg) cfg); // FIXME JNR remove cast
+      importer.rebuildIndexes(rootContainer);
+    }
+    catch (ExecutionException execEx)
+    {
+      logger.traceException(execEx);
+      throw new DirectoryException(errorRC, ERR_EXECUTION_ERROR.get(execEx.getMessage()));
+    }
+    catch (InterruptedException intEx)
+    {
+      logger.traceException(intEx);
+      throw new DirectoryException(errorRC, ERR_INTERRUPTED_ERROR.get(intEx.getMessage()));
+    }
+    catch (ConfigException ce)
+    {
+      logger.traceException(ce);
+      throw new DirectoryException(errorRC, ce.getMessageObject());
+    }
+    catch (StorageRuntimeException e)
+    {
+      logger.traceException(e);
+      throw new DirectoryException(errorRC, LocalizableMessage.raw(e.getMessage()));
+    }
+    catch (InitializationException e)
+    {
+      logger.traceException(e);
+      throw new InitializationException(e.getMessageObject());
+    }
+    finally
+    {
+      closeTemporaryRootContainer(openRootContainer);
+    }
+  }
 
   /** {@inheritDoc} */
   @Override

--
Gitblit v1.10.0