Keep references to threads and shut them down more properly
diff --git a/src/main/java/com/google/code/gossip/manager/ActiveGossipThread.java b/src/main/java/com/google/code/gossip/manager/ActiveGossipThread.java
index c2168fa..3f3964b 100644
--- a/src/main/java/com/google/code/gossip/manager/ActiveGossipThread.java
+++ b/src/main/java/com/google/code/gossip/manager/ActiveGossipThread.java
@@ -18,7 +18,7 @@
private GossipManager _gossipManager;
- private AtomicBoolean _keepRunning;
+ private final AtomicBoolean _keepRunning;
public ActiveGossipThread(GossipManager gossipManager) {
_gossipManager = gossipManager;
@@ -36,10 +36,12 @@
_keepRunning.set(false);
}
}
-
- _keepRunning = null;
+ shutdown();
}
+ public void shutdown(){
+ _keepRunning.set(false);
+ }
/**
* Performs the sending of the membership list, after we have
* incremented our own heartbeat.
diff --git a/src/main/java/com/google/code/gossip/manager/GossipManager.java b/src/main/java/com/google/code/gossip/manager/GossipManager.java
index a12cf23..ed7a03e 100644
--- a/src/main/java/com/google/code/gossip/manager/GossipManager.java
+++ b/src/main/java/com/google/code/gossip/manager/GossipManager.java
@@ -38,8 +38,10 @@
private ExecutorService _gossipThreadExecutor;
private Class<? extends PassiveGossipThread> _passiveGossipThreadClass;
+ private PassiveGossipThread passiveGossipThread;
private Class<? extends ActiveGossipThread> _activeGossipThreadClass;
+ private ActiveGossipThread activeGossipThread;
public GossipManager(Class<? extends PassiveGossipThread> passiveGossipThreadClass,
Class<? extends ActiveGossipThread> activeGossipThreadClass, String address, int port,
@@ -118,10 +120,10 @@
}
_gossipThreadExecutor = Executors.newCachedThreadPool();
try {
- _gossipThreadExecutor.execute(_passiveGossipThreadClass.getConstructor(GossipManager.class)
- .newInstance(this));
- _gossipThreadExecutor.execute(_activeGossipThreadClass.getConstructor(GossipManager.class)
- .newInstance(this));
+ passiveGossipThread = _passiveGossipThreadClass.getConstructor(GossipManager.class).newInstance(this);
+ _gossipThreadExecutor.execute(passiveGossipThread);
+ activeGossipThread = _activeGossipThreadClass.getConstructor(GossipManager.class).newInstance(this);
+ _gossipThreadExecutor.execute(activeGossipThread);
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException | NoSuchMethodException | SecurityException e1) {
throw new RuntimeException(e1);
@@ -142,6 +144,14 @@
*/
public void shutdown() {
_gossipThreadExecutor.shutdown();
+ passiveGossipThread.shutdown();
+ activeGossipThread.shutdown();
+ try {
+ boolean result = _gossipThreadExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS);
+ System.err.println("Terminate retuned " + result);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
_gossipServiceRunning.set(false);
}
}
diff --git a/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java b/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java
index d95acd7..044a7d4 100644
--- a/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java
+++ b/src/main/java/com/google/code/gossip/manager/PassiveGossipThread.java
@@ -125,8 +125,13 @@
_keepRunning.set(false);
}
}
+ shutdown();
}
+ public void shutdown(){
+ _server.close();
+ }
+
/**
* Abstract method for merging the local and remote list.
* @param gossipManager The GossipManager for retrieving the local members and dead members list.
diff --git a/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java b/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java
index eaf77ef..e30f39a 100644
--- a/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java
+++ b/src/test/java/io/teknek/gossip/TenNodeThreeSeedTest.java
@@ -18,6 +18,15 @@
@Test
public void test() throws UnknownHostException, InterruptedException{
+ abc();
+ }
+
+ @Test
+ public void testAgain() throws UnknownHostException, InterruptedException{
+ abc();
+ }
+
+ public void abc() throws InterruptedException, UnknownHostException{
GossipSettings settings = new GossipSettings();
int seedNodes = 3;
ArrayList<GossipMember> startupMembers = new ArrayList<GossipMember>();
@@ -39,6 +48,6 @@
}
for (int i = 0; i < clusterMembers; ++i) {
clients.get(i).shutdown();
- }
+ }
}
}