From 641e89ef0e15c9edde69f3b8cf82c7dd5f68687a Mon Sep 17 00:00:00 2001
From: Yannick Lecaillez <ylecaillez@forgerock.com>
Date: Wed, 30 Sep 2015 14:28:07 +0000
Subject: [PATCH] OPENDJ-2016: New on disk merge import strategy based on storage engine.
---
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java | 64 +++++++++++++++++++++-----------
1 files changed, 42 insertions(+), 22 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 d0c12d9..f941ce7 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
@@ -53,7 +53,6 @@
import org.opends.server.api.MonitorProvider;
import org.opends.server.backends.RebuildConfig;
import org.opends.server.backends.VerifyConfig;
-import org.opends.server.backends.pluggable.ImportSuffixCommand.SuffixImportStrategy;
import org.opends.server.backends.pluggable.spi.AccessMode;
import org.opends.server.backends.pluggable.spi.Storage;
import org.opends.server.backends.pluggable.spi.StorageInUseException;
@@ -86,6 +85,8 @@
import org.opends.server.util.LDIFException;
import org.opends.server.util.RuntimeInformation;
+import com.forgerock.opendj.util.StaticUtils;
+
/**
* This is an implementation of a Directory Server Backend which stores entries locally
* in a pluggable storage.
@@ -656,6 +657,10 @@
public LDIFImportResult importLDIF(LDIFImportConfig importConfig, ServerContext serverContext)
throws DirectoryException
{
+ if (importConfig.appendToExistingData() || importConfig.replaceExistingEntries())
+ {
+ throw new UnsupportedOperationException("append/replace mode is not supported by this backend.");
+ }
RuntimeInformation.logInfo();
// If the rootContainer is open, the backend is initialized by something else.
@@ -664,33 +669,31 @@
{
throw new DirectoryException(getServerErrorResultCode(), ERR_IMPORT_BACKEND_ONLINE.get());
}
- for (DN dn : cfg.getBaseDN())
- {
- ImportSuffixCommand importCommand = new ImportSuffixCommand(dn, importConfig);
- if (importCommand.getSuffixImportStrategy() == SuffixImportStrategy.MERGE_DB_WITH_LDIF)
- {
- // fail-fast to avoid ending up in an unrecoverable state for the server
- throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, ERR_IMPORT_UNSUPPORTED_WITH_BRANCH.get());
- }
- }
try
{
- if (OnDiskMergeBufferImporter.mustClearBackend(importConfig, cfg))
+ try
{
- try
+ if (importConfig.clearBackend())
{
// clear all files before opening the root container
storage.removeStorageFiles();
}
- catch (Exception e)
- {
- throw new DirectoryException(getServerErrorResultCode(), ERR_REMOVE_FAIL.get(e.getMessage()), e);
- }
}
-
+ catch (Exception e)
+ {
+ throw new DirectoryException(getServerErrorResultCode(), ERR_REMOVE_FAIL.get(e.getMessage()), e);
+ }
rootContainer = newRootContainer(AccessMode.READ_WRITE);
- return getImportStrategy().importLDIF(importConfig, rootContainer, serverContext);
+ try
+ {
+ rootContainer.getStorage().close();
+ return getImportStrategy(serverContext, rootContainer).importLDIF(importConfig);
+ }
+ finally
+ {
+ rootContainer.getStorage().open(AccessMode.READ_WRITE);
+ }
}
catch (StorageRuntimeException e)
{
@@ -704,6 +707,11 @@
{
throw new DirectoryException(getServerErrorResultCode(), e.getMessageObject(), e);
}
+ catch (Exception e)
+ {
+ throw new DirectoryException(getServerErrorResultCode(), LocalizableMessage.raw(StaticUtils
+ .stackTraceToSingleLineString(e, false)), e);
+ }
finally
{
try
@@ -727,10 +735,9 @@
}
}
- private ImportStrategy getImportStrategy() throws DirectoryException
+ private ImportStrategy getImportStrategy(ServerContext serverContext, RootContainer rootContainer)
{
- // TODO JNR may call new SuccessiveAddsImportStrategy() depending on configured import strategy
- return new OnDiskMergeBufferImporter.StrategyImpl(cfg);
+ return new OnDiskMergeImporter.StrategyImpl(serverContext, rootContainer, cfg);
}
/** {@inheritDoc} */
@@ -803,7 +810,15 @@
{
rootContainer = newRootContainer(AccessMode.READ_WRITE);
}
- new OnDiskMergeBufferImporter(rootContainer, rebuildConfig, cfg, serverContext).rebuildIndexes();
+ rootContainer.getStorage().close();
+ try
+ {
+ getImportStrategy(serverContext, rootContainer).rebuildIndex(rebuildConfig);
+ }
+ finally
+ {
+ rootContainer.getStorage().open(AccessMode.READ_WRITE);
+ }
}
catch (ExecutionException execEx)
{
@@ -825,6 +840,11 @@
{
throw e;
}
+ catch (Exception ex)
+ {
+ throw new DirectoryException(getServerErrorResultCode(), LocalizableMessage.raw(stackTraceToSingleLineString(ex)),
+ ex);
+ }
finally
{
closeTemporaryRootContainer(openRootContainer);
--
Gitblit v1.10.0