From 39b9ec062c54025ba8bb5f1d13f6d581c6371087 Mon Sep 17 00:00:00 2001
From: Copilot <198982749+Copilot@users.noreply.github.com>
Date: Thu, 02 Apr 2026 09:01:47 +0000
Subject: [PATCH] fix: retry loop for Windows Service start race condition (issue #259) (#609)

---
 opendj-server-legacy/src/build-tools/windows/service.c |   45 +++++++++++++++++++++++++++++++++++++++------
 opendj-server-legacy/lib/launcher_administrator.exe    |    0 
 opendj-server-legacy/lib/opendj_service.exe            |    0 
 opendj-server-legacy/lib/winlauncher.exe               |    0 
 4 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/opendj-server-legacy/lib/launcher_administrator.exe b/opendj-server-legacy/lib/launcher_administrator.exe
index 303839e..bf71337 100644
--- a/opendj-server-legacy/lib/launcher_administrator.exe
+++ b/opendj-server-legacy/lib/launcher_administrator.exe
Binary files differ
diff --git a/opendj-server-legacy/lib/opendj_service.exe b/opendj-server-legacy/lib/opendj_service.exe
index 55b8da6..e4f456c 100644
--- a/opendj-server-legacy/lib/opendj_service.exe
+++ b/opendj-server-legacy/lib/opendj_service.exe
Binary files differ
diff --git a/opendj-server-legacy/lib/winlauncher.exe b/opendj-server-legacy/lib/winlauncher.exe
index 3a96c39..f971e1b 100755
--- a/opendj-server-legacy/lib/winlauncher.exe
+++ b/opendj-server-legacy/lib/winlauncher.exe
Binary files differ
diff --git a/opendj-server-legacy/src/build-tools/windows/service.c b/opendj-server-legacy/src/build-tools/windows/service.c
index 0f9f6e0..42082bc 100644
--- a/opendj-server-legacy/src/build-tools/windows/service.c
+++ b/opendj-server-legacy/src/build-tools/windows/service.c
@@ -13,6 +13,7 @@
  *
  * Copyright 2008-2010 Sun Microsystems, Inc.
  * Portions Copyright 2011-2013 ForgeRock AS.
+ * Portions Copyright 2026 3A Systems, LLC.
  */
 
 #include "service.h"
@@ -563,12 +564,44 @@
 
   if (createOk && waitOk)
     {
-    BOOL running;
-      // Just check once if the server is running or not: since the wait
-      // wait was successful, if the server is getting the lock, it already
-      // got it.
-    isServerRunning(&running, TRUE);
-    if (running)
+      // The batch file process completed successfully, but the Java server
+      // process may not have acquired the lock file yet (especially on
+      // Windows 11 where JVM startup can be slower). Retry with a loop
+      // similar to the else-if branch below.
+      // See: https://github.com/OpenIdentityPlatform/OpenDJ/issues/259
+      const DWORD DEFAULT_TRIES = 100;
+      int nTries = DEFAULT_TRIES;
+      char * nTriesEnv = getenv("OPENDJ_WINDOWS_SERVICE_START_NTRIES");
+      BOOL running = FALSE;
+      if (nTriesEnv != NULL)
+      {
+        debug("OPENDJ_WINDOWS_SERVICE_START_NTRIES env var set to %s", nTriesEnv);
+        nTries = (int)strtol(nTriesEnv, (char **)NULL, 10);
+        if (nTries <= 0)
+        {
+          nTries = DEFAULT_TRIES;
+        }
+      }
+      else
+      {
+        debug("OPENDJ_WINDOWS_SERVICE_START_NTRIES is not set.  Using default %d tries.", nTries);
+      }
+
+      while ((nTries > 0) && !running)
+      {
+        nTries--;
+        if (isServerRunning(&running, TRUE) != SERVICE_RETURN_OK)
+        {
+          break;
+        }
+        if (!running)
+        {
+          debug("Sleeping for 5 seconds to allow the process to get the lock.  %d tries remaining.",
+              nTries);
+          Sleep(5000);
+        }
+      }
+      if (running)
       {
         returnValue = SERVICE_RETURN_OK;
         debug("doStartApplication: server running.");

--
Gitblit v1.10.0