mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Copilot
5 days ago 39b9ec062c54025ba8bb5f1d13f6d581c6371087
fix: retry loop for Windows Service start race condition (issue #259) (#609)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: vharseko <6818498+vharseko@users.noreply.github.com>
Co-authored-by: Valery Kharseko <vharseko@3a-systems.ru>
4 files modified
45 ■■■■ changed files
opendj-server-legacy/lib/launcher_administrator.exe patch | view | raw | blame | history
opendj-server-legacy/lib/opendj_service.exe patch | view | raw | blame | history
opendj-server-legacy/lib/winlauncher.exe patch | view | raw | blame | history
opendj-server-legacy/src/build-tools/windows/service.c 45 ●●●● patch | view | raw | blame | history
opendj-server-legacy/lib/launcher_administrator.exe
Binary files differ
opendj-server-legacy/lib/opendj_service.exe
Binary files differ
opendj-server-legacy/lib/winlauncher.exe
Binary files differ
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.");