From e131e3cef7357a2f5acdc3d86979b8c5486ca71b Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 20 Mar 2012 11:19:25 +0000
Subject: [PATCH] Fix OPENDJ-457: Sleeping replication threads prevent server from shutting down

---
 opends/src/server/org/opends/server/core/IdleTimeLimitThread.java |   35 +++++++++++++++++++++++++++++------
 1 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/IdleTimeLimitThread.java b/opends/src/server/org/opends/server/core/IdleTimeLimitThread.java
index 57750d0..403cd1e 100644
--- a/opends/src/server/org/opends/server/core/IdleTimeLimitThread.java
+++ b/opends/src/server/org/opends/server/core/IdleTimeLimitThread.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
+ *      Portions copyright 2012 ForgeRock AS.
  */
 package org.opends.server.core;
 import org.opends.messages.Message;
@@ -38,6 +39,7 @@
 import org.opends.server.types.DisconnectReason;
 
 import static org.opends.server.loggers.debug.DebugLogger.*;
+
 import org.opends.server.loggers.ErrorLogger;
 import static org.opends.messages.CoreMessages.*;
 
@@ -60,8 +62,9 @@
 
 
 
-  // Indicates whether a shutdown request has been received.
-  private boolean shutdownRequested;
+  // Shutdown monitor state.
+  private volatile boolean shutdownRequested;
+  private final Object shutdownLock = new Object();
 
 
 
@@ -93,10 +96,26 @@
     {
       try
       {
-        try
+        synchronized (shutdownLock)
         {
-          sleep(sleepTime);
-        } catch (InterruptedException ie) {}
+          if (!shutdownRequested)
+          {
+            try
+            {
+              shutdownLock.wait(sleepTime);
+            }
+            catch (InterruptedException e)
+            {
+              // Server shutdown monitor may interrupt slow threads.
+              if (debugEnabled())
+              {
+                TRACER.debugCaught(DebugLogLevel.ERROR, e);
+              }
+              shutdownRequested = true;
+              break;
+            }
+          }
+        }
 
         sleepTime = 5000L;
         for (ConnectionHandler<?> ch : DirectoryServer.getConnectionHandlers())
@@ -181,7 +200,11 @@
    */
   public void processServerShutdown(Message reason)
   {
-    shutdownRequested = true;
+    synchronized (shutdownLock)
+    {
+      shutdownRequested = true;
+      shutdownLock.notifyAll();
+    }
   }
 }
 

--
Gitblit v1.10.0