From 4217a2c5d7de480dc78b92e5f32a6e8a796834cd Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 02 Jul 2013 09:48:50 +0000
Subject: [PATCH] Fix OPENDJ-1043: Worker Thread was interrupted while waiting for new work while shutting down 

---
 opends/src/server/org/opends/server/replication/protocol/Session.java |   26 +++++++++++++++++++-------
 1 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/protocol/Session.java b/opends/src/server/org/opends/server/replication/protocol/Session.java
index d54f8c8..6befa27 100644
--- a/opends/src/server/org/opends/server/replication/protocol/Session.java
+++ b/opends/src/server/org/opends/server/replication/protocol/Session.java
@@ -36,6 +36,7 @@
 import java.net.Socket;
 import java.net.SocketException;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.Lock;
@@ -333,14 +334,25 @@
     final byte[] buffer = msg.getBytes(protocolVersion);
     if (isRunning.get())
     {
-      try {
-        sendQueue.put(buffer);
+      while (!closeInitiated)
+      {
+        try
+        {
+          // Avoid blocking forever so that we can check for session closure.
+          if (sendQueue.offer(buffer, 100, TimeUnit.MILLISECONDS))
+          {
+            return;
+          }
+        }
+        catch (final InterruptedException e)
+        {
+          setSessionError(e);
+          throw new IOException(e.getMessage());
+        }
       }
-      catch (final InterruptedException e) {
-        setSessionError(e);
-        throw new IOException(e.getMessage());
-      }
-    } else {
+    }
+    else
+    {
       send(buffer);
     }
   }

--
Gitblit v1.10.0