Author: mreutegg
Date: Tue Jan 19 08:17:37 2016
New Revision: 1725448

URL: http://svn.apache.org/viewvc?rev=1725448&view=rev
Log:
OAK-3881: TCPBroadcaster causes shutdown delay

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/broadcast/TCPBroadcaster.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/broadcast/TCPBroadcaster.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/broadcast/TCPBroadcaster.java?rev=1725448&r1=1725447&r2=1725448&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/broadcast/TCPBroadcaster.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/persistentCache/broadcast/TCPBroadcaster.java
 Tue Jan 19 08:17:37 2016
@@ -36,8 +36,8 @@ import java.util.UUID;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.LinkedBlockingDeque;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.slf4j.Logger;
@@ -69,7 +69,7 @@ public class TCPBroadcaster implements B
     private String ownKeyUUID = UUID.randomUUID().toString();
     private byte[] ownKey = ownKeyUUID.getBytes(UTF8);
     
-    private volatile boolean stop;
+    private final AtomicBoolean stop = new AtomicBoolean(false);
     
     public TCPBroadcaster(String config) {
         LOG.info("Init " + config);
@@ -201,7 +201,7 @@ public class TCPBroadcaster implements B
     }
     
     void accept() {
-        while (!stop) {
+        while (isRunning()) {
             try {
                 final Socket socket = serverSocket.accept();
                 Runnable r = new Runnable() {
@@ -238,7 +238,7 @@ public class TCPBroadcaster implements B
             } catch (SocketTimeoutException e) {
                 // ignore
             } catch (IOException e) {
-                if (!stop) {
+                if (isRunning()) {
                     LOG.warn("Receive failed", e);
                 }
                 // ignore
@@ -253,21 +253,25 @@ public class TCPBroadcaster implements B
     }
     
     void discover() {
-        while (!stop) {
+        while (isRunning()) {
             DynamicBroadcastConfig b = broadcastConfig;
             if (b != null) {
                 readClients(b);
             }
             for (Client c : clients.values()) {
                 c.tryConnect();
-                if (stop) {
+                if (!isRunning()) {
                     break;
                 }
             }
-            try {
-                Thread.sleep(2000);
-            } catch (InterruptedException e) {
-                // ignore
+            synchronized (stop) {
+                if (isRunning()) {
+                    try {
+                        stop.wait(2000);
+                    } catch (InterruptedException e) {
+                        // ignore
+                    }
+                }
             }
         }
     }
@@ -304,10 +308,10 @@ public class TCPBroadcaster implements B
     }
     
     void send() {
-        while (!stop) {
+        while (isRunning()) {
             try {
                 ByteBuffer buff = sendBuffer.poll(10, TimeUnit.MILLISECONDS);
-                if (buff != null && !stop) {
+                if (buff != null && isRunning()) {
                     sendBuffer(buff);
                 }
             } catch (InterruptedException e) {
@@ -339,7 +343,7 @@ public class TCPBroadcaster implements B
         buff.get(data);
         for (Client c : clients.values()) {
             c.send(data);
-            if (stop) {
+            if (!isRunning()) {
                 break;
             }
         }
@@ -357,9 +361,12 @@ public class TCPBroadcaster implements B
 
     @Override
     public void close() {
-        if (!stop) {
+        if (isRunning()) {
             LOG.debug("Stopping");
-            this.stop = true;
+            synchronized (stop) {
+                stop.set(true);
+                stop.notifyAll();
+            }
             try {
                 serverSocket.close();
             } catch (IOException e) {
@@ -383,8 +390,8 @@ public class TCPBroadcaster implements B
         }
     }
 
-    public boolean isRunning() {
-        return !stop;
+    public final boolean isRunning() {
+        return !stop.get();
     }
     
     static class Client {


Reply via email to