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/replication/protocol/HeartbeatThread.java |   42 ++++++++++++++++++++++++------------------
 1 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/protocol/HeartbeatThread.java b/opends/src/server/org/opends/server/replication/protocol/HeartbeatThread.java
index 778a5a4..86f9024 100644
--- a/opends/src/server/org/opends/server/replication/protocol/HeartbeatThread.java
+++ b/opends/src/server/org/opends/server/replication/protocol/HeartbeatThread.java
@@ -23,7 +23,7 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
- *      Portions Copyright 2011 ForgeRock AS
+ *      Portions Copyright 2011-2012 ForgeRock AS
  */
 
 package org.opends.server.replication.protocol;
@@ -32,6 +32,7 @@
 import static org.opends.server.loggers.debug.DebugLogger.*;
 
 import org.opends.server.loggers.debug.DebugTracer;
+import org.opends.server.types.DebugLogLevel;
 
 import java.io.IOException;
 
@@ -123,32 +124,37 @@
           }
         }
 
-        try
+        long sleepTime = session.getLastPublishTime() +
+            heartbeatInterval - now;
+        if (sleepTime <= 0)
         {
-          long sleepTime = session.getLastPublishTime() +
-              heartbeatInterval - now;
-          if (sleepTime <= 0)
-          {
-            sleepTime = heartbeatInterval;
-          }
+          sleepTime = heartbeatInterval;
+        }
 
-          if (debugEnabled())
-          {
-            TRACER.debugVerbose("Heartbeat thread sleeping for %d", sleepTime);
-          }
+        if (debugEnabled())
+        {
+          TRACER.debugVerbose("Heartbeat thread sleeping for %d", sleepTime);
+        }
 
-          synchronized (shutdownLock)
+        synchronized (shutdownLock)
+        {
+          if (!shutdown)
           {
-            if (!shutdown)
+            try
             {
               shutdownLock.wait(sleepTime);
             }
+            catch (InterruptedException e)
+            {
+              // Server shutdown monitor may interrupt slow threads.
+              if (debugEnabled())
+              {
+                TRACER.debugCaught(DebugLogLevel.ERROR, e);
+              }
+              shutdown = true;
+            }
           }
         }
-        catch (InterruptedException e)
-        {
-          // Keep looping.
-        }
       }
     }
     catch (IOException e)

--
Gitblit v1.10.0