From 4d82cc0c15bd43f70375eec295e9f08e092bc9ed Mon Sep 17 00:00:00 2001
From: davidely <davidely@localhost>
Date: Mon, 07 May 2007 16:33:57 +0000
Subject: [PATCH] Updating Windows service related code and executables. This fixes a problem with stopping the server on Windows, and also adds a lot of debug logging to the service code, so we can track problems down in the future
---
opendj-sdk/opends/src/build-tools/windows/winlauncher.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 100 insertions(+), 15 deletions(-)
diff --git a/opendj-sdk/opends/src/build-tools/windows/winlauncher.c b/opendj-sdk/opends/src/build-tools/windows/winlauncher.c
index 5bd057d..bdcae20 100644
--- a/opendj-sdk/opends/src/build-tools/windows/winlauncher.c
+++ b/opendj-sdk/opends/src/build-tools/windows/winlauncher.c
@@ -27,7 +27,6 @@
#include "winlauncher.h"
-
// ----------------------------------------------------
// Generates the pid file name for a given instanceDir.
// Returns TRUE if the command name could be initiated and
@@ -38,13 +37,18 @@
{
BOOL returnValue;
char* relativePath = "\\logs\\server.pid";
+
+ debug("Attempting to get the PID file for instanceDir='%s'", instanceDir);
+
if ((strlen(relativePath) + strlen(instanceDir)) < maxSize)
{
- sprintf(pidFile, "%s\\logs\\server.pid", instanceDir);
+ sprintf(pidFile, maxSize, "%s\\logs\\server.pid", instanceDir);
returnValue = TRUE;
+ debug("PID file name is '%s'.", pidFile);
}
else
{
+ debugError("Unable to get the PID file name because the path was too long.");
returnValue = FALSE;
}
return returnValue;
@@ -68,7 +72,9 @@
{
returnValue = TRUE;
}
-
+
+ debug("File '%s' does%s exist.", fileName, (returnValue ? "" : " not"));
+
return returnValue;
} // fileExists
@@ -84,23 +90,28 @@
char pidFile[PATH_SIZE];
int nTries = 10;
+ debug("Attempting to delete the PID file from instanceDir='%s'.", instanceDir);
// Sometimes the lock on the system in windows takes time to be released.
if (getPidFile(instanceDir, pidFile, PATH_SIZE))
{
while (fileExists(pidFile) && (nTries > 0) && !returnValue)
{
+ debug("PID file '%s' exists, attempting to remove it.", instanceDir);
if (remove(pidFile) == 0)
{
+ debug("Successfully removed PID file: '%s'.", pidFile);
returnValue = TRUE;
}
else
{
- Sleep(500);
nTries--;
+ debug("Failed to remove the PID file. Sleeping for a bit. Will try %d more time(s).", nTries);
+ Sleep(500);
}
}
}
+ debug("deletePidFile('%s') returning %d.", instanceDir, returnValue);
return returnValue;
} // deletePidFile
@@ -118,11 +129,13 @@
char buf[BUF_SIZE];
int read;
+ debug("Attempting to get the PID for the server rooted at '%s'.", instanceDir);
if (getPidFile(instanceDir, pidFile, PATH_SIZE))
{
if ((f = fopen(pidFile, "r")) != NULL)
{
read = fread(buf, 1, sizeof(buf),f);
+ debug("Read '%s' from the PID file '%s'.", buf, pidFile);
}
if (f != NULL)
@@ -132,7 +145,9 @@
}
else
{
- fprintf(stderr, "File %s could not be opened", pidFile);
+ char * msg = "File %s could not be opened.\nMost likely the server has already stopped.\n\n";
+ debug(msg, pidFile);
+ fprintf(stderr, msg, pidFile);
returnValue = 0;
}
}
@@ -140,6 +155,7 @@
{
returnValue = 0;
}
+ debug("getPid('%s') returning %d.", instanceDir, returnValue);
return returnValue;
} // getPid
@@ -152,7 +168,12 @@
BOOL killProcess(int pid)
{
BOOL processDead;
- HANDLE procHandle = OpenProcess(
+ HANDLE procHandle;
+
+ debug("killProcess(pid=%d)", pid);
+
+ debug("Opening process with pid=%d.", pid);
+ procHandle = OpenProcess(
PROCESS_TERMINATE // to terminate the process
| PROCESS_QUERY_INFORMATION, // to get exit code
FALSE, // handle is not inheritable
@@ -161,6 +182,7 @@
if (procHandle == NULL)
{
+ debug("The process with pid=%d has already terminated.", pid);
// process already dead
processDead = TRUE;
}
@@ -168,14 +190,17 @@
{
if (!TerminateProcess(procHandle, 0))
{
+ debugError("Failed to terminate process (pid=%d) lastError=%d.", pid, GetLastError());
// failed to terminate the process
processDead = FALSE;
}
else
{
- // wait for the process to end.
DWORD exitCode;
int nTries = 20;
+
+ debug("Successfully began termination process for (pid=%d).", pid);
+ // wait for the process to end.
processDead = FALSE;
while ((nTries > 0) && !processDead)
@@ -184,18 +209,21 @@
if (exitCode == STILL_ACTIVE)
{
// process is still alive, let's wait 1 sec and loop again
- Sleep(1000);
nTries--;
+ debug("Process (pid=%d) has not yet exited. Sleeping for 1 second and will try %d more time(s).", pid, nTries);
+ Sleep(1000);
}
else
{
+ debug("Process (pid=%d) has exited with exit code %d.", pid, exitCode);
processDead = TRUE;
}
}
}
CloseHandle(procHandle);
}
-
+
+ debug("killProcess(pid=%d) returning %d", pid, processDead);
return processDead;
} // killProcess
@@ -206,11 +234,13 @@
// otherwise.
// ----------------------------------------------------
BOOL createPidFile(const char* instanceDir, int pid)
-{
+{
BOOL returnValue = FALSE;
char pidFile[PATH_SIZE];
FILE *f;
+ debug("createPidFile(instanceDir='%s',pid=%d)", instanceDir, pid);
+
if (getPidFile(instanceDir, pidFile, PATH_SIZE))
{
if ((f = fopen(pidFile, "w")) != NULL)
@@ -218,14 +248,17 @@
fprintf(f, "%d", pid);
fclose (f);
returnValue = TRUE;
+ debug("Successfully put pid=%d in the pid file '%s'.", pid, pidFile);
}
else
{
+ debugError("Couldn't create the pid file '%s' because the file could not be opened.", pidFile);
returnValue = FALSE;
}
}
else
{
+ debugError("Couldn't create the pid file because the pid file name could not be constructed.");
returnValue = FALSE;
}
@@ -246,7 +279,14 @@
int curCmdInd = 0;
int i = 0;
BOOL overflow = FALSE;
+
+ debug("Constructing full command line from arguments:");
+ for (i = 0; (argv[i] != NULL); i++)
+ {
+ debug(" argv[%d]: %s", i, argv[i]);
+ }
+ i = 0;
while ((argv[i] != NULL) && !overflow)
{
const char* curarg = argv[i++];
@@ -319,6 +359,15 @@
}
}
}
+
+ if (overflow)
+ {
+ debugError("Failed to construct the full commandline because the buffer wasn't big enough.");
+ }
+ else
+ {
+ debug("The full commandline is '%s'.", command);
+ }
return !overflow;
} // getCommandLine
@@ -350,7 +399,7 @@
int childPid;
char command[COMMAND_SIZE];
-
+
if (getCommandLine(argv, command, COMMAND_SIZE))
{
childPid = spawn(command, TRUE);
@@ -362,11 +411,13 @@
}
else
{
+ debugError("Couldn't start the child process because the spawn failed.");
returnValue = -1;
}
}
else
{
+ debugError("Couldn't start the child process because the full command line could not be constructed.");
returnValue = -1;
}
@@ -401,6 +452,8 @@
int childPid;
+ debug("Attempting to stop the server running at root '%s'.", instanceDir);
+
childPid = getPid(instanceDir);
if (childPid != 0)
@@ -411,7 +464,11 @@
deletePidFile(instanceDir);
}
}
-
+ else
+ {
+ debug("Could not stop the server running at root '%s' because the pid could not be located.", instanceDir);
+ }
+
return returnCode;
} // stop
@@ -450,9 +507,18 @@
if (getCommandLine(argv, command, COMMAND_SIZE))
{
returnValue = spawn(command, TRUE);
+ if (returnValue <= 0)
+ {
+ debugError("Failed to launch the child process '%s'.", command);
+ }
+ else
+ {
+ debug("Successfully launched the child process '%s'.", command);
+ }
}
else
{
+ debugError("Couldn't launch the child process because the full command line could not be constructed.");
returnValue = -1;
}
@@ -471,9 +537,25 @@
int main(int argc, char* argv[])
{
int returnCode;
- char* subcommand = argv[1];
- char* instanceDir = argv[2];
+ char* subcommand = NULL;
+ char* instanceDir = NULL;
+ int i;
+ debug("main called.");
+ for (i = 0; i < argc; i++) {
+ debug(" argv[%d] = '%s'", i, argv[i]);
+ }
+
+ if (argc < 3) {
+ char * msg = "Expected command line args of [subcommand] [server directory], but got %d arguments.\n";
+ debugError(msg, argc - 1);
+ fprintf(stderr, msg, argc - 1);
+ return -1;
+ }
+
+ subcommand = argv[1];
+ instanceDir = argv[2];
+
argv += 3;
if (strcmp(subcommand, "start") == 0)
@@ -490,9 +572,12 @@
}
else
{
- fprintf(stderr, "Unknown subcommand: [%s]", subcommand);
+ char * msg = "Unknown subcommand: [%s]\n";
+ debugError(msg, argc - 1);
+ fprintf(stderr, msg, subcommand);
returnCode = -1;
}
+ debug("main finished. Returning %d", returnCode);
return returnCode;
}
--
Gitblit v1.10.0