From c22f0fcf3eb1eb76298874d6143b1acc42ee208c Mon Sep 17 00:00:00 2001
From: jcambon <jcambon@localhost>
Date: Thu, 09 Apr 2009 10:08:41 +0000
Subject: [PATCH] Fix for issue #3814 : start-ds script return before server has started 

---
 opends/src/server/org/opends/server/core/DirectoryServer.java    |   16 ++++++++
 opends/src/server/org/opends/server/tools/WaitForFileDelete.java |   19 +++++++++
 opends/src/messages/messages/core.properties                     |   13 +++++-
 opends/resource/bin/start-ds                                     |    8 ++--
 opends/resource/bin/start-ds.bat                                 |   10 ++--
 5 files changed, 53 insertions(+), 13 deletions(-)

diff --git a/opends/resource/bin/start-ds b/opends/resource/bin/start-ds
index 3ca2128..5f1ea84 100755
--- a/opends/resource/bin/start-ds
+++ b/opends/resource/bin/start-ds
@@ -23,7 +23,7 @@
 # CDDL HEADER END
 #
 #
-#      Copyright 2006-2008 Sun Microsystems, Inc.
+#      Copyright 2006-2009 Sun Microsystems, Inc.
 
 
 # Capture the current working directory so that we can change to it later.
@@ -109,10 +109,10 @@
   if test ${EC} -eq 99
   then
     "${OPENDS_JAVA_BIN}" -Xms8M -Xmx8M org.opends.server.tools.WaitForFileDelete \
-         --targetFile "${STARTING_FILE}" --logFile "${LOG_FILE}"
+         --targetFile "${STARTING_FILE}" --logFile "${LOG_FILE}" "${@}"
   else
     "${OPENDS_JAVA_BIN}" -Xms8M -Xmx8M org.opends.server.tools.WaitForFileDelete \
-         --targetFile "${STARTING_FILE}"
+         --targetFile "${STARTING_FILE}" "${@}"
   fi
   EC=${?}
   if test ${EC} -eq 0
@@ -130,7 +130,7 @@
       exit 1
     fi
   fi
-  exit ${?}
+  exit ${EC}
 else
   if test ${EC} -eq 100
   then
diff --git a/opends/resource/bin/start-ds.bat b/opends/resource/bin/start-ds.bat
index b66ea50..040e760 100644
--- a/opends/resource/bin/start-ds.bat
+++ b/opends/resource/bin/start-ds.bat
@@ -23,7 +23,7 @@
 rem CDDL HEADER END
 rem
 rem
-rem      Copyright 2006-2008 Sun Microsystems, Inc.
+rem      Copyright 2006-2009 Sun Microsystems, Inc.
 
 setlocal
 for %%i in (%~sf0) do set DIR_HOME=%%~dPsi..
@@ -101,7 +101,7 @@
 if exist "%INSTANCE_ROOT%\lib\set-java-args.bat" DO call "%INSTANCE_ROOT%\lib\set-java-args.bat"
 "%INSTALL_ROOT%\lib\winlauncher.exe" start "%INSTANCE_ROOT%" "%OPENDS_JAVA_BIN%" %OPENDS_JAVA_ARGS%  %SCRIPT_NAME_ARG% org.opends.server.core.DirectoryServer --configClass org.opends.server.extensions.ConfigFileHandler --configFile "%INSTANCE_ROOT%\config\config.ldif" %*
 echo %SCRIPT%: Waiting for "%INSTANCE_ROOT%\logs\server.out" to be deleted >> %LOG%
-"%OPENDS_JAVA_BIN%" -Xms8M -Xmx8M org.opends.server.tools.WaitForFileDelete --targetFile "%INSTANCE_ROOT%\logs\server.starting" --logFile "%INSTANCE_ROOT%\logs\server.out"
+"%OPENDS_JAVA_BIN%" -Xms8M -Xmx8M org.opends.server.tools.WaitForFileDelete --targetFile "%INSTANCE_ROOT%\logs\server.starting" --logFile "%INSTANCE_ROOT%\logs\server.out" %*
 goto checkStarted
 
 :runDetachQuiet
@@ -111,7 +111,7 @@
 if exist "%INSTANCE_ROOT%\lib\set-java-args.bat" DO call "%INSTANCE_ROOT%\lib\set-java-args.bat"
 "%INSTALL_ROOT%\lib\winlauncher.exe" start "%INSTANCE_ROOT%" "%OPENDS_JAVA_BIN%" %OPENDS_JAVA_ARGS%  %SCRIPT_NAME_ARG% org.opends.server.core.DirectoryServer --configClass org.opends.server.extensions.ConfigFileHandler --configFile "%INSTANCE_ROOT%\config\config.ldif" %*
 echo %SCRIPT%: Waiting for "%INSTANCE_ROOT%\logs\server.out" to be deleted >> %LOG%
-"%OPENDS_JAVA_BIN%" -Xms8M -Xmx8M org.opends.server.tools.WaitForFileDelete --targetFile "%INSTANCE_ROOT%\logs\server.starting" --logFile "%INSTANCE_ROOT%\logs\server.out" >> %LOG%
+"%OPENDS_JAVA_BIN%" -Xms8M -Xmx8M org.opends.server.tools.WaitForFileDelete --targetFile "%INSTANCE_ROOT%\logs\server.starting" --logFile "%INSTANCE_ROOT%\logs\server.out" %* >> %LOG%
 goto checkStarted
 
 :runDetachCalledByWinService
@@ -124,7 +124,7 @@
 if exist "%INSTANCE_ROOT%\lib\set-java-args.bat" DO call "%INSTANCE_ROOT%\lib\set-java-args.bat"
 "%INSTALL_ROOT%\lib\winlauncher.exe" start "%INSTANCE_ROOT%" "%OPENDS_JAVA_BIN%" -Xrs %OPENDS_JAVA_ARGS% %SCRIPT_NAME_ARG% org.opends.server.core.DirectoryServer --configClass org.opends.server.extensions.ConfigFileHandler --configFile "%INSTANCE_ROOT%\config\config.ldif" %*
 echo %SCRIPT%: Waiting for "%INSTANCE_ROOT%\logs\server.out" to be deleted >> %LOG%
-"%OPENDS_JAVA_BIN%" -Xms8M -Xmx8M org.opends.server.tools.WaitForFileDelete --targetFile "%INSTANCE_ROOT%\logs\server.starting" --logFile "%INSTANCE_ROOT%\logs\server.out" --outputFile "%INSTANCE_ROOT%\logs\winservice.out"
+"%OPENDS_JAVA_BIN%" -Xms8M -Xmx8M org.opends.server.tools.WaitForFileDelete --targetFile "%INSTANCE_ROOT%\logs\server.starting" --logFile "%INSTANCE_ROOT%\logs\server.out" --outputFile "%INSTANCE_ROOT%\logs\winservice.out" %*
 erase "%INSTANCE_ROOT%\logs\server.startingservice"
 goto checkStarted
 
@@ -132,7 +132,7 @@
 echo %SCRIPT%: Run as service >> %LOG%
 "%OPENDS_JAVA_BIN%" -Xms8M -Xmx8M org.opends.server.tools.StartWindowsService
 echo %SCRIPT%: Waiting for "%INSTANCE_ROOT%\logs\server.startingservice" to be deleted >> %LOG%
-"%OPENDS_JAVA_BIN%" -Xms8M -Xmx8M org.opends.server.tools.WaitForFileDelete --targetFile "%INSTANCE_ROOT%\logs\server.startingservice"
+"%OPENDS_JAVA_BIN%" -Xms8M -Xmx8M org.opends.server.tools.WaitForFileDelete --targetFile "%INSTANCE_ROOT%\logs\server.startingservice" %*
 rem Type the contents the winwervice.out file and delete it.
 if exist "%INSTANCE_ROOT%\logs\winservice.out" type "%INSTANCE_ROOT%\logs\winservice.out"
 if exist "%INSTANCE_ROOT%\logs\winservice.out" erase "%INSTANCE_ROOT%\logs\winservice.out"
diff --git a/opends/src/messages/messages/core.properties b/opends/src/messages/messages/core.properties
index 390e72a..27ce32c 100644
--- a/opends/src/messages/messages/core.properties
+++ b/opends/src/messages/messages/core.properties
@@ -20,7 +20,7 @@
 #
 # CDDL HEADER END
 #
-#      Copyright 2006-2008 Sun Microsystems, Inc.
+#      Copyright 2006-2009 Sun Microsystems, Inc.
 
 
 
@@ -1428,7 +1428,8 @@
 SEVERE_ERR_MODIFY_NO_MODIFICATIONS_566=Entry %s cannot be updated because the \
  request did not contain any modifications
 INFO_DSCORE_DESCRIPTION_NODETACH_567=Do not detach from the terminal and \
- continue running in the foreground
+ continue running in the foreground. This option cannot be used with the \
+-t, --timeout option.
 MILD_ERR_ENTRY_INCREMENT_NO_SUCH_ATTRIBUTE_568=Unable to increment the value \
  of attribute %s because that attribute does not exist in the entry
 INFO_DSCORE_TOOL_DESCRIPTION_569=This utility can be used to start the \
@@ -1821,4 +1822,10 @@
 SEVERE_ERR_CRYPTOMGR_FAILED_INSTANCE_CERTIFICATE_NULL_721=The CryptoManager \
 entry "%s" (the instance-key-pair public-key-certificate) does not contain \
 a public-key certificate
-
+INFO_DSCORE_DESCRIPTION_TIMEOUT_722=Maximum time (in seconds) to wait before \
+the command returns (the server continues the startup process, regardless). \
+A value of '0' indicates an infinite timeout, which means that the command \
+returns only when the server startup is completed. The default value is \
+60 seconds. This option cannot be used with the -N, --nodetach option.
+FATAL_ERR_DSCORE_ERROR_NODETACH_TIMEOUT_723=In no-detach mode, the 'timeout' option \
+cannot be used.
diff --git a/opends/src/server/org/opends/server/core/DirectoryServer.java b/opends/src/server/org/opends/server/core/DirectoryServer.java
index efa1d16..f07e184 100644
--- a/opends/src/server/org/opends/server/core/DirectoryServer.java
+++ b/opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -227,6 +227,7 @@
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.ArgumentParser;
 import org.opends.server.util.args.BooleanArgument;
+import org.opends.server.util.args.IntegerArgument;
 import org.opends.server.util.args.StringArgument;
 import org.opends.server.workflowelement.WorkflowElement;
 import org.opends.server.workflowelement.WorkflowElementConfigManager;
@@ -9127,6 +9128,7 @@
     // Define the arguments that may be provided to the server.
     BooleanArgument checkStartability      = null;
     BooleanArgument quietMode              = null;
+    IntegerArgument timeout                = null;
     BooleanArgument windowsNetStart        = null;
     BooleanArgument displayUsage           = null;
     BooleanArgument fullVersion            = null;
@@ -9210,6 +9212,14 @@
       argParser.addArgument(quietMode);
 
 
+      // Not used in this class, but required by the start-ds script
+      // (see issue #3814)
+      timeout = new IntegerArgument("timeout", 't', "timeout", true, false,
+                                    true, INFO_SECONDS_PLACEHOLDER.get(), 60,
+                                    null, true, 0, false,
+                                    0, INFO_DSCORE_DESCRIPTION_TIMEOUT.get());
+      argParser.addArgument(timeout);
+
       displayUsage = new BooleanArgument("help", 'H', "help",
                                          INFO_DSCORE_DESCRIPTION_USAGE.get());
       argParser.addArgument(displayUsage);
@@ -9303,6 +9313,12 @@
       RuntimeInformation.printInfo();
       return;
     }
+    else if (noDetach.isPresent() && timeout.isPresent()) {
+      Message message = ERR_DSCORE_ERROR_NODETACH_TIMEOUT.get();
+      System.err.println(message);
+      System.err.println(argParser.getUsage());
+      System.exit(1);
+    }
 
 
     // At this point, we know that we're going to try to start the server.
diff --git a/opends/src/server/org/opends/server/tools/WaitForFileDelete.java b/opends/src/server/org/opends/server/tools/WaitForFileDelete.java
index 41d0f8f..85bfda7 100644
--- a/opends/src/server/org/opends/server/tools/WaitForFileDelete.java
+++ b/opends/src/server/org/opends/server/tools/WaitForFileDelete.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.tools;
 import org.opends.messages.Message;
@@ -39,6 +39,7 @@
 import org.opends.server.util.args.StringArgument;
 
 import static org.opends.messages.ToolMessages.*;
+import static org.opends.messages.CoreMessages.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
 
@@ -125,6 +126,8 @@
     StringArgument  logFilePath    = null;
     StringArgument  targetFilePath = null;
     StringArgument  outputFilePath = null;
+    BooleanArgument useLastKnownGoodConfig = null;
+    BooleanArgument quietMode              = null;
 
     Message toolDescription = INFO_WAIT4DEL_TOOL_DESCRIPTION.get();
     ArgumentParser argParser = new ArgumentParser(CLASS_NAME, toolDescription,
@@ -161,6 +164,20 @@
       argParser.addArgument(timeout);
 
 
+      // Not used in this class, but required by the start-ds script
+      // (see issue #3814)
+      useLastKnownGoodConfig =
+           new BooleanArgument("lastknowngoodconfig", 'L',
+                               "useLastKnownGoodConfig",
+                               INFO_DSCORE_DESCRIPTION_LASTKNOWNGOODCFG.get());
+      argParser.addArgument(useLastKnownGoodConfig);
+
+      // Not used in this class, but required by the start-ds script
+      // (see issue #3814)
+      quietMode = new BooleanArgument("quiet", 'Q', "quiet",
+                                      INFO_DESCRIPTION_QUIET.get());
+      argParser.addArgument(quietMode);
+
       showUsage = new BooleanArgument("help", 'H', "help",
                                       INFO_WAIT4DEL_DESCRIPTION_HELP.get());
       argParser.addArgument(showUsage);

--
Gitblit v1.10.0