From 4a17c7f153f4912f376b5976eea7caa501187442 Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Thu, 02 Jun 2016 10:15:13 +0000
Subject: [PATCH] OPENDJ-3046 Cleanup server offline tools environment
---
opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java | 6 +
opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java | 222 ++++++++++++++++++++-----------------
opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java | 96 ++++++++-------
opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java | 6 +
opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java | 6 +
5 files changed, 187 insertions(+), 149 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java b/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
index 8d1dad8..dd9d97c 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
@@ -5375,53 +5375,7 @@
}
}
- // Shut down the backends.
- for (Backend<?> backend : directoryServer.backends.values())
- {
- try
- {
- for (BackendInitializationListener listener : getBackendInitializationListeners())
- {
- listener.performBackendPreFinalizationProcessing(backend);
- }
-
- // Deregister all the local backend workflow elements that have been
- // registered with the server.
- LocalBackendWorkflowElement.removeAll();
-
- for (BackendInitializationListener listener :
- directoryServer.backendInitializationListeners)
- {
- listener.performBackendPostFinalizationProcessing(backend);
- }
-
- backend.finalizeBackend();
-
- // Remove the shared lock for this backend.
- try
- {
- String lockFile = LockFileManager.getBackendLockFileName(backend);
- StringBuilder failureReason = new StringBuilder();
- if (! LockFileManager.releaseLock(lockFile, failureReason))
- {
- logger.warn(WARN_SHUTDOWN_CANNOT_RELEASE_SHARED_BACKEND_LOCK, backend.getBackendID(), failureReason);
- // FIXME -- Do we need to send an admin alert?
- }
- }
- catch (Exception e2)
- {
- logger.traceException(e2);
-
- logger.warn(WARN_SHUTDOWN_CANNOT_RELEASE_SHARED_BACKEND_LOCK,
- backend.getBackendID(), stackTraceToSingleLineString(e2));
- // FIXME -- Do we need to send an admin alert?
- }
- }
- catch (Exception e)
- {
- logger.traceException(e);
- }
- }
+ shutdownBackends();
if (directoryServer.configurationHandler != null) {
directoryServer.configurationHandler.finalize();
@@ -5473,6 +5427,54 @@
directoryServer = getNewInstance(envConfig);
}
+ /** Shutdown directory server backends. */
+ public static void shutdownBackends()
+ {
+ for (Backend<?> backend : directoryServer.backends.values())
+ {
+ try
+ {
+ for (BackendInitializationListener listener : getBackendInitializationListeners())
+ {
+ listener.performBackendPreFinalizationProcessing(backend);
+ }
+
+ for (BackendInitializationListener listener : directoryServer.backendInitializationListeners)
+ {
+ listener.performBackendPostFinalizationProcessing(backend);
+ }
+
+ backend.finalizeBackend();
+
+ // Remove the shared lock for this backend.
+ try
+ {
+ String lockFile = LockFileManager.getBackendLockFileName(backend);
+ StringBuilder failureReason = new StringBuilder();
+ if (! LockFileManager.releaseLock(lockFile, failureReason))
+ {
+ logger.warn(WARN_SHUTDOWN_CANNOT_RELEASE_SHARED_BACKEND_LOCK, backend.getBackendID(), failureReason);
+ // FIXME -- Do we need to send an admin alert?
+ }
+ }
+ catch (Exception e2)
+ {
+ logger.traceException(e2);
+
+ logger.warn(WARN_SHUTDOWN_CANNOT_RELEASE_SHARED_BACKEND_LOCK,
+ backend.getBackendID(), stackTraceToSingleLineString(e2));
+ // FIXME -- Do we need to send an admin alert?
+ }
+ }
+ catch (Exception e)
+ {
+ logger.traceException(e);
+ }
+ }
+ // Deregister all the local backend workflow elements that have been registered with the server.
+ LocalBackendWorkflowElement.removeAll();
+ }
+
/**
* Destroy key structures in the current Directory Server instance in a manner
* that can help detect any inappropriate cached references to server
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java
index 30a55ee..af9d1c4 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java
@@ -631,6 +631,12 @@
return !errorOccurred ? 0 : 1;
}
+ @Override
+ protected void cleanup()
+ {
+ DirectoryServer.shutdownBackends();
+ }
+
private Set<AttributeType> toAttributeTypes(StringArgument attributeArg)
{
if (attributeArg == null)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java
index 2c9cd44..c3f3323 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java
@@ -930,6 +930,12 @@
return retCode;
}
+ @Override
+ protected void cleanup()
+ {
+ DirectoryServer.shutdownBackends();
+ }
+
private boolean useBackend(Set<DN> includeBranches, List<DN> dnlist)
{
for (DN baseDN : dnlist)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java
index 7f82579..858b168 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java
@@ -292,6 +292,12 @@
return rebuildIndex(currentBackend, rebuildConfig);
}
+ @Override
+ protected void cleanup()
+ {
+ DirectoryServer.shutdownBackends();
+ }
+
/**
* Configures the rebuild index process. i.e.: decodes the selected DN and
* retrieves the backend which holds it. Finally, initializes and sets the
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
index 2730fcf..3aba0c6 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
@@ -110,6 +110,17 @@
PrintStream err);
/**
+ * Cleanup task environment after offline run.
+ * Default implementation does nothing.
+ * Tasks which initialize some static part of the DirectoryServer instance (e.g admin data local backends) must
+ * override this method to shutdown all needed component to prevent JVM environment alteration.
+ */
+ protected void cleanup()
+ {
+ // Do nothing by default.
+ }
+
+ /**
* Creates an argument parser prepopulated with arguments for processing
* input for scheduling tasks with the task backend.
*
@@ -170,7 +181,7 @@
*/
protected void validateTaskArgs() throws ArgumentException, ClientException
{
- if (processAsTask())
+ if (isRemoteTask())
{
taskScheduleArgs.validateArgs();
}
@@ -232,11 +243,9 @@
protected int process(LDAPConnectionArgumentParser argParser,
boolean initializeServer,
PrintStream out, PrintStream err) {
- int ret;
-
if (testIfOffline())
{
- if (!processAsTask())
+ if (!isRemoteTask())
{
return RUN_OFFLINE;
}
@@ -246,115 +255,124 @@
}
}
- if (processAsTask())
+ if (!isRemoteTask())
{
- if (initializeServer)
+ try
{
- try
- {
- DirectoryServer.bootstrapClient();
- DirectoryServer.initializeJMX();
- }
- catch (Exception e)
- {
- printWrappedText(err, ERR_SERVER_BOOTSTRAP_ERROR.get(getExceptionMessage(e)));
- return 1;
- }
- }
-
- LDAPConnection conn = null;
- try {
- conn = argParser.connect(out, err);
- TaskClient tc = new TaskClient(conn);
- TaskEntry taskEntry = tc.schedule(this);
- LocalizableMessage startTime = taskEntry.getScheduledStartTime();
- if (taskEntry.getTaskState() == TaskState.RECURRING) {
- printWrappedText(out, INFO_TASK_TOOL_RECURRING_TASK_SCHEDULED.get(taskEntry.getType(), taskEntry.getId()));
- } else if (startTime == null || startTime.length() == 0) {
- printWrappedText(out, INFO_TASK_TOOL_TASK_SCHEDULED_NOW.get(taskEntry.getType(), taskEntry.getId()));
- } else {
- printWrappedText(out, INFO_TASK_TOOL_TASK_SCHEDULED_FUTURE.get(
- taskEntry.getType(), taskEntry.getId(), taskEntry.getScheduledStartTime()));
- }
- if (!taskScheduleArgs.startArg.isPresent()) {
-
- // Poll the task printing log messages until finished
- String taskId = taskEntry.getId();
- Set<LocalizableMessage> printedLogMessages = new HashSet<>();
- do {
- taskEntry = tc.getTaskEntry(taskId);
- List<LocalizableMessage> logs = taskEntry.getLogMessages();
- for (LocalizableMessage log : logs) {
- if (printedLogMessages.add(log)) {
- out.println(log);
- }
- }
-
- try {
- Thread.sleep(SYNCHRONOUS_TASK_POLL_INTERVAL);
- } catch (InterruptedException e) {
- // ignore
- }
-
- } while (!taskEntry.isDone());
- if (TaskState.isSuccessful(taskEntry.getTaskState())) {
- if (taskEntry.getTaskState() != TaskState.RECURRING) {
- printWrappedText(out, INFO_TASK_TOOL_TASK_SUCESSFULL.get(taskEntry.getType(), taskEntry.getId()));
- }
- return 0;
- } else {
- printWrappedText(out, INFO_TASK_TOOL_TASK_NOT_SUCESSFULL.get(taskEntry.getType(), taskEntry.getId()));
- return 1;
- }
- }
- ret = 0;
- } catch (LDAPConnectionException e) {
- if (isWrongPortException(e,
- Integer.valueOf(argParser.getArguments().getPort())))
- {
- printWrappedText(err, ERR_TASK_LDAP_FAILED_TO_CONNECT_WRONG_PORT.get(
- argParser.getArguments().getHostName(), argParser.getArguments().getPort()));
- } else {
- printWrappedText(err, ERR_TASK_TOOL_START_TIME_NO_LDAP.get(e.getMessage()));
- }
- ret = 1;
- } catch (DecodeException ae) {
- printWrappedText(err, ERR_TASK_TOOL_DECODE_ERROR.get(ae.getMessage()));
- ret = 1;
- } catch (IOException ioe) {
- printWrappedText(err, ERR_TASK_TOOL_IO_ERROR.get(ioe));
- ret = 1;
- } catch (LDAPException le) {
- printWrappedText(err, ERR_TASK_TOOL_LDAP_ERROR.get(le.getMessage()));
- ret = 1;
- } catch (OpenDsException e) {
- printWrappedText(err, e.getMessageObject());
- ret = 1;
- } catch (ArgumentException e) {
- argParser.displayMessageAndUsageReference(err, e.getMessageObject());
- ret = 1;
+ return processLocal(initializeServer, out, err);
}
finally
{
- if (conn != null)
+ if (initializeServer)
{
- try
- {
- conn.close(null);
- }
- catch (Throwable t)
- {
- // Ignore.
- }
+ cleanup();
}
}
- } else {
- ret = processLocal(initializeServer, out, err);
}
- return ret;
+
+ if (initializeServer)
+ {
+ try
+ {
+ DirectoryServer.bootstrapClient();
+ DirectoryServer.initializeJMX();
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_SERVER_BOOTSTRAP_ERROR.get(getExceptionMessage(e)));
+ return 1;
+ }
+ }
+
+ LDAPConnection conn = null;
+ try {
+ conn = argParser.connect(out, err);
+ TaskClient tc = new TaskClient(conn);
+ TaskEntry taskEntry = tc.schedule(this);
+ LocalizableMessage startTime = taskEntry.getScheduledStartTime();
+ if (taskEntry.getTaskState() == TaskState.RECURRING) {
+ printWrappedText(out, INFO_TASK_TOOL_RECURRING_TASK_SCHEDULED.get(taskEntry.getType(), taskEntry.getId()));
+ } else if (startTime == null || startTime.length() == 0) {
+ printWrappedText(out, INFO_TASK_TOOL_TASK_SCHEDULED_NOW.get(taskEntry.getType(), taskEntry.getId()));
+ } else {
+ printWrappedText(out, INFO_TASK_TOOL_TASK_SCHEDULED_FUTURE.get(
+ taskEntry.getType(), taskEntry.getId(), taskEntry.getScheduledStartTime()));
+ }
+ if (!taskScheduleArgs.startArg.isPresent()) {
+
+ // Poll the task printing log messages until finished
+ String taskId = taskEntry.getId();
+ Set<LocalizableMessage> printedLogMessages = new HashSet<>();
+ do {
+ taskEntry = tc.getTaskEntry(taskId);
+ List<LocalizableMessage> logs = taskEntry.getLogMessages();
+ for (LocalizableMessage log : logs) {
+ if (printedLogMessages.add(log)) {
+ out.println(log);
+ }
+ }
+
+ try {
+ Thread.sleep(SYNCHRONOUS_TASK_POLL_INTERVAL);
+ } catch (InterruptedException e) {
+ // ignore
+ }
+
+ } while (!taskEntry.isDone());
+ if (TaskState.isSuccessful(taskEntry.getTaskState())) {
+ if (taskEntry.getTaskState() != TaskState.RECURRING) {
+ printWrappedText(out, INFO_TASK_TOOL_TASK_SUCESSFULL.get(taskEntry.getType(), taskEntry.getId()));
+ }
+ return 0;
+ } else {
+ printWrappedText(out, INFO_TASK_TOOL_TASK_NOT_SUCESSFULL.get(taskEntry.getType(), taskEntry.getId()));
+ return 1;
+ }
+ }
+ return 0;
+ } catch (LDAPConnectionException e) {
+ if (isWrongPortException(e,
+ Integer.valueOf(argParser.getArguments().getPort())))
+ {
+ printWrappedText(err, ERR_TASK_LDAP_FAILED_TO_CONNECT_WRONG_PORT.get(
+ argParser.getArguments().getHostName(), argParser.getArguments().getPort()));
+ } else {
+ printWrappedText(err, ERR_TASK_TOOL_START_TIME_NO_LDAP.get(e.getMessage()));
+ }
+ return 1;
+ } catch (DecodeException ae) {
+ printWrappedText(err, ERR_TASK_TOOL_DECODE_ERROR.get(ae.getMessage()));
+ return 1;
+ } catch (IOException ioe) {
+ printWrappedText(err, ERR_TASK_TOOL_IO_ERROR.get(ioe));
+ return 1;
+ } catch (LDAPException le) {
+ printWrappedText(err, ERR_TASK_TOOL_LDAP_ERROR.get(le.getMessage()));
+ return 1;
+ } catch (OpenDsException e) {
+ printWrappedText(err, e.getMessageObject());
+ return 1;
+ } catch (ArgumentException e) {
+ argParser.displayMessageAndUsageReference(err, e.getMessageObject());
+ return 1;
+ }
+ finally
+ {
+ if (conn != null)
+ {
+ try
+ {
+ conn.close(null);
+ }
+ catch (Throwable t)
+ {
+ // Ignore.
+ }
+ }
+ }
}
- private boolean processAsTask() {
+ private boolean isRemoteTask() {
return argParser.connectionArgumentsPresent();
}
--
Gitblit v1.10.0