From 75a571bfa9d382b75e664eba3dfd58d17c694e11 Mon Sep 17 00:00:00 2001
From: Violette Roche-Montane <violette.roche-montane@forgerock.com>
Date: Tue, 03 Sep 2013 09:27:02 +0000
Subject: [PATCH] CR-2181 OPENDJ-1030 Upgrade : add a task to rebuild ds-sync-hist index when upgrading from 2.5.0-Xpress
---
opendj-sdk/opends/src/server/org/opends/server/tools/RebuildIndex.java | 185 ++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 162 insertions(+), 23 deletions(-)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/RebuildIndex.java b/opendj-sdk/opends/src/server/org/opends/server/tools/RebuildIndex.java
index 1c4ef96..1cf7ab7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/RebuildIndex.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/RebuildIndex.java
@@ -36,6 +36,7 @@
import static org.opends.server.util.StaticUtils.*;
import org.opends.server.util.BuildVersion;
+import org.opends.server.util.StaticUtils;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.BooleanArgument;
import org.opends.server.util.args.LDAPConnectionArgumentParser;
@@ -91,6 +92,11 @@
"org.opends.server.tools.RebuildIndex",
INFO_REBUILDINDEX_TOOL_DESCRIPTION.get());
+ private RebuildConfig rebuildConfig = new RebuildConfig();
+ private Backend currentBackend = null;
+
+
+
/**
* Processes the command-line arguments and invokes the rebuild process.
*
@@ -329,38 +335,52 @@
setErrorAndDebugLogPublisher(out, err);
}
+ if (!configureRebuildProcess(baseDNString.getValue()))
+ {
+ return 1;
+ }
+
+ return rebuildIndex(currentBackend, rebuildConfig);
+ }
+
+ /**
+ * Configures the rebuild index process. i.e.: decodes the selected DN and
+ * retrieves the backend which holds it. Finally, initializes and sets the
+ * rebuild configuration.
+ *
+ * @param dn
+ * User selected base DN.
+ * @return A boolean representing the result of the process.
+ */
+ private boolean configureRebuildProcess(final String dn) {
// Decodes the base DN provided by the user.
DN rebuildBaseDN = null;
try
{
- rebuildBaseDN = DN.decode(baseDNString.getValue());
+ rebuildBaseDN = DN.decode(dn);
}
catch (Exception e)
{
final Message message =
- ERR_CANNOT_DECODE_BASE_DN.get(baseDNString.getValue(),
+ ERR_CANNOT_DECODE_BASE_DN.get(dn,
getExceptionMessage(e));
logError(message);
- return 1;
+ return false;
}
// Retrieves the backend which holds the selected base DN.
- Backend backend = null;
try
{
- backend = retrieveBackend(rebuildBaseDN);
+ setCurrentBackend(retrieveBackend(rebuildBaseDN));
}
catch (Exception e)
{
logError(Message.raw(e.getMessage()));
- return 1;
+ return false;
}
- // Sets the rebuild index configuration.
- final RebuildConfig rebuildConfig =
- initializeRebuildIndexConfiguration(rebuildBaseDN);
-
- return rebuildIndex(backend, rebuildConfig);
+ setRebuildConfig(initializeRebuildIndexConfiguration(rebuildBaseDN));
+ return true;
}
/**
@@ -396,6 +416,7 @@
/**
* Initializes the directory server.<br />
+ * Processes to :
* - bootstrapClient
* - initializeJMX
* - initializeConfiguration
@@ -405,10 +426,10 @@
*
* @param directoryServer
* The current instance.
- * @param outStream
+ * @param out
* The output stream to use for standard output, or {@code null} if
* standard output is not needed.
- * @param errStream
+ * @param err
* The output stream to use for standard error, or {@code null} if
* standard error is not needed.
* @return The error code.
@@ -527,32 +548,32 @@
private RebuildConfig initializeRebuildIndexConfiguration(
final DN rebuildBaseDN)
{
- final RebuildConfig rebuildConfig = new RebuildConfig();
- rebuildConfig.setBaseDN(rebuildBaseDN);
+ final RebuildConfig config = new RebuildConfig();
+ config.setBaseDN(rebuildBaseDN);
for (final String s : indexList.getValues())
{
- rebuildConfig.addRebuildIndex(s);
+ config.addRebuildIndex(s);
}
if (rebuildAll.isPresent())
{
- rebuildConfig.setRebuildMode(RebuildMode.ALL);
+ config.setRebuildMode(RebuildMode.ALL);
}
else if (rebuildDegraded.isPresent())
{
- rebuildConfig.setRebuildMode(RebuildMode.DEGRADED);
+ config.setRebuildMode(RebuildMode.DEGRADED);
}
else
{
if (clearDegradedState.isPresent())
{
- rebuildConfig.isClearDegradedState(true);
+ config.isClearDegradedState(true);
}
- rebuildConfig.setRebuildMode(RebuildMode.USER_DEFINED);
+ config.setRebuildMode(RebuildMode.USER_DEFINED);
}
- rebuildConfig.setTmpDirectory(tmpDirectory.getValue());
- return rebuildConfig;
+ config.setTmpDirectory(tmpDirectory.getValue());
+ return config;
}
/**
@@ -635,7 +656,7 @@
/**
* Gets information about the backends defined in the server. Iterates through
- * them, finding the one backend to be verified.
+ * them, finding the one that holds the base DN.
*
* @param selectedDN
* The user selected DN.
@@ -699,6 +720,82 @@
}
/**
+ * This function allow internal use of the rebuild index tools. This function
+ * rebuilds indexes shared by multiple backends.
+ *
+ * @param initializeServer
+ * Indicates whether to initialize the server.
+ * @param out
+ * The print stream which is used to display errors/debug lines.
+ * Usually redirected into a logger if the tool is used as external.
+ * @param args
+ * The arguments used to launch the rebuild index process.
+ * @return An integer indicating the result of this action.
+ */
+ public int rebuildIndexesWithinMultipleBackends(
+ final boolean initializeServer, final PrintStream out,
+ final String... args)
+ {
+ try
+ {
+ setErrorAndDebugLogPublisher(out, out);
+
+ try
+ {
+ initializeArguments(true);
+ }
+ catch (ArgumentException ae)
+ {
+ final Message message = ERR_CANNOT_INITIALIZE_ARGS.get(ae.getMessage());
+ out.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+
+ try
+ {
+ argParser.parseArguments(args);
+ }
+ catch (ArgumentException ae)
+ {
+ final Message message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
+ out.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+
+ final DirectoryServer directoryServer = DirectoryServer.getInstance();
+ if (initializeServer)
+ {
+ initializeServer(directoryServer, out, out);
+ }
+
+ for (final String dn : baseDNString.getValues())
+ {
+ if (!configureRebuildProcess(dn))
+ {
+ return 1;
+ }
+
+ final int result =
+ rebuildIndex(getCurrentBackend(), getRebuildConfig());
+ // If the rebuild index is going bad, process is stopped.
+ if (result != 0)
+ {
+ out.println(String.format(
+ "An error occurs during the rebuild index process" +
+ " in %s, rebuild index(es) aborted.",
+ dn));
+ return 1;
+ }
+ }
+ }
+ finally
+ {
+ StaticUtils.close(out);
+ }
+ return 0;
+ }
+
+ /**
* {@inheritDoc}
*/
public String getTaskId()
@@ -781,4 +878,46 @@
{
return RebuildTask.class;
}
+
+ /**
+ * Returns the rebuild configuration.
+ *
+ * @return The rebuild configuration.
+ */
+ public RebuildConfig getRebuildConfig()
+ {
+ return rebuildConfig;
+ }
+
+ /**
+ * Sets the rebuild configuration.
+ *
+ * @param rebuildConfig
+ * The rebuild configuration to set.
+ */
+ public void setRebuildConfig(RebuildConfig rebuildConfig)
+ {
+ this.rebuildConfig = rebuildConfig;
+ }
+
+ /**
+ * Returns the current backend.
+ *
+ * @return The current backend.
+ */
+ public Backend getCurrentBackend()
+ {
+ return currentBackend;
+ }
+
+ /**
+ * Sets the current backend.
+ *
+ * @param currentBackend
+ * The current backend to set.
+ */
+ public void setCurrentBackend(Backend currentBackend)
+ {
+ this.currentBackend = currentBackend;
+ }
}
--
Gitblit v1.10.0