You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ra...@apache.org on 2019/02/04 15:44:37 UTC
[curator] branch CURATOR-498 updated: CURATOR-498
This is an automated email from the ASF dual-hosted git repository.
randgalt pushed a commit to branch CURATOR-498
in repository https://gitbox.apache.org/repos/asf/curator.git
The following commit(s) were added to refs/heads/CURATOR-498 by this push:
new e6defc4 CURATOR-498
e6defc4 is described below
commit e6defc42c10fd48fa1b752fafa17983a4b55b074
Author: randgalt <ra...@apache.org>
AuthorDate: Mon Feb 4 10:44:24 2019 -0500
CURATOR-498
Removed no-longer-necessary KillSession2. Also, now always use the reflection based code to insert the session end event given what we've found about the previous version inside of ZooKeeper. I also opened a PR in ZooKeeper (see ZOOKEEPER-3269) to add a supported method to do this for the future.
---
.../org/apache/curator/utils/Compatibility.java | 45 ++++++++++++++-----
.../curator/utils/InjectSessionExpiration.java | 29 +-----------
.../test/java/org/apache/curator/BasicTests.java | 4 +-
.../apache/curator/TestSessionFailRetryLoop.java | 10 ++---
.../curator/framework/imps/ProtectedMode.java | 13 +++---
.../imps/TestEnabledSessionExpiredState.java | 4 +-
.../curator/framework/imps/TestFrameworkEdges.java | 22 ++++-----
.../state/TestConnectionStateManager.java | 2 +-
.../framework/recipes/leader/LeaderLatch.java | 14 ++++++
.../framework/recipes/cache/BaseTestTreeCache.java | 13 +++++-
.../framework/recipes/cache/TestNodeCache.java | 4 +-
.../recipes/cache/TestPathChildrenCache.java | 10 ++---
.../framework/recipes/cache/TestTreeCache.java | 26 +++--------
.../framework/recipes/leader/TestLeaderLatch.java | 34 ++++++++++++++
.../recipes/leader/TestLeaderSelector.java | 8 +---
.../recipes/locks/TestInterProcessMutex.java | 4 +-
.../recipes/locks/TestInterProcessMutexBase.java | 4 +-
.../recipes/nodes/TestPersistentEphemeralNode.java | 52 +++++++++++-----------
.../org/apache/curator/test/Compatibility.java | 8 ----
.../org/apache/curator/test/Compatibility.java | 7 ---
.../curator/test/compatibility/KillSession2.java | 40 -----------------
.../x/discovery/details/TestServiceDiscovery.java | 8 ++--
22 files changed, 172 insertions(+), 189 deletions(-)
diff --git a/curator-client/src/main/java/org/apache/curator/utils/Compatibility.java b/curator-client/src/main/java/org/apache/curator/utils/Compatibility.java
index 58b62a7..1ee2301 100644
--- a/curator-client/src/main/java/org/apache/curator/utils/Compatibility.java
+++ b/curator-client/src/main/java/org/apache/curator/utils/Compatibility.java
@@ -18,8 +18,12 @@
*/
package org.apache.curator.utils;
+import org.apache.zookeeper.WatchedEvent;
+import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
+import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.lang.reflect.Method;
/**
* Utils to help with ZK 3.4.x compatibility
@@ -27,20 +31,36 @@ import org.slf4j.LoggerFactory;
public class Compatibility
{
private static final boolean hasZooKeeperAdmin;
+ private static final Method queueEventMethod;
+ private static final Logger logger = LoggerFactory.getLogger(Compatibility.class);
+
static
{
- boolean hasIt;
+ boolean localHasZooKeeperAdmin;
try
{
Class.forName("org.apache.zookeeper.admin.ZooKeeperAdmin");
- hasIt = true;
+ localHasZooKeeperAdmin = true;
}
catch ( ClassNotFoundException e )
{
- hasIt = false;
- LoggerFactory.getLogger(Compatibility.class).info("Running in ZooKeeper 3.4.x compatibility mode");
+ localHasZooKeeperAdmin = false;
+ logger.info("Running in ZooKeeper 3.4.x compatibility mode");
+ }
+ hasZooKeeperAdmin = localHasZooKeeperAdmin;
+
+ Method localQueueEventMethod;
+ try
+ {
+ Class<?> testableClass = Class.forName("org.apache.zookeeper.Testable");
+ localQueueEventMethod = testableClass.getMethod("queueEvent", WatchedEvent.class);
+ }
+ catch ( ReflectiveOperationException ignore )
+ {
+ localQueueEventMethod = null;
+ LoggerFactory.getLogger(Compatibility.class).info("Using emulated InjectSessionExpiration");
}
- hasZooKeeperAdmin = hasIt;
+ queueEventMethod = localQueueEventMethod;
}
/**
@@ -61,16 +81,21 @@ public class Compatibility
*/
public static void injectSessionExpiration(ZooKeeper zooKeeper)
{
- if ( isZK34() )
+ if ( isZK34() || (queueEventMethod == null) )
{
InjectSessionExpiration.injectSessionExpiration(zooKeeper);
}
else
{
- // LOL - this method was proposed by me (JZ) in 2013 for totally unrelated reasons
- // it got added to ZK 3.5 and now does exactly what we need
- // https://issues.apache.org/jira/browse/ZOOKEEPER-1730
- zooKeeper.getTestable().injectSessionExpiration();
+ try
+ {
+ WatchedEvent event = new WatchedEvent(Watcher.Event.EventType.None, Watcher.Event.KeeperState.Expired, null);
+ queueEventMethod.invoke(zooKeeper.getTestable(), event);
+ }
+ catch ( Exception e )
+ {
+ logger.error("Could not call Testable.queueEvent()", e);
+ }
}
}
}
diff --git a/curator-client/src/main/java/org/apache/curator/utils/InjectSessionExpiration.java b/curator-client/src/main/java/org/apache/curator/utils/InjectSessionExpiration.java
index caf9cbf..8ad2b5d 100644
--- a/curator-client/src/main/java/org/apache/curator/utils/InjectSessionExpiration.java
+++ b/curator-client/src/main/java/org/apache/curator/utils/InjectSessionExpiration.java
@@ -31,40 +31,22 @@ public class InjectSessionExpiration
{
private static final Field cnxnField;
private static final Field eventThreadField;
- private static final Field sendThreadField;
private static final Method queueEventMethod;
- private static final Method queueEventOfDeathMethod;
- private static final Method getClientCnxnSocketMethod;
- private static final Method wakeupCnxnMethod;
static
{
Field localCnxnField;
Field localEventThreadField;
- Field localSendThreadField;
Method localQueueEventMethod;
- Method localEventOfDeathMethod;
- Method localGetClientCnxnSocketMethod;
- Method localWakeupCnxnMethod;
try
{
Class<?> eventThreadClass = Class.forName("org.apache.zookeeper.ClientCnxn$EventThread");
- Class<?> sendThreadClass = Class.forName("org.apache.zookeeper.ClientCnxn$SendThread");
- Class<?> clientCnxnSocketClass = Class.forName("org.apache.zookeeper.ClientCnxnSocket");
localCnxnField = ZooKeeper.class.getDeclaredField("cnxn");
localCnxnField.setAccessible(true);
localEventThreadField = ClientCnxn.class.getDeclaredField("eventThread");
localEventThreadField.setAccessible(true);
- localSendThreadField = ClientCnxn.class.getDeclaredField("sendThread");
- localSendThreadField.setAccessible(true);
localQueueEventMethod = eventThreadClass.getDeclaredMethod("queueEvent", WatchedEvent.class);
localQueueEventMethod.setAccessible(true);
- localEventOfDeathMethod = eventThreadClass.getDeclaredMethod("queueEventOfDeath");
- localEventOfDeathMethod.setAccessible(true);
- localGetClientCnxnSocketMethod = sendThreadClass.getDeclaredMethod("getClientCnxnSocket");
- localGetClientCnxnSocketMethod.setAccessible(true);
- localWakeupCnxnMethod = clientCnxnSocketClass.getDeclaredMethod("wakeupCnxn");
- localWakeupCnxnMethod.setAccessible(true);
}
catch ( ReflectiveOperationException e )
{
@@ -72,11 +54,7 @@ public class InjectSessionExpiration
}
cnxnField = localCnxnField;
eventThreadField = localEventThreadField;
- sendThreadField = localSendThreadField;
queueEventMethod = localQueueEventMethod;
- queueEventOfDeathMethod = localEventOfDeathMethod;
- getClientCnxnSocketMethod = localGetClientCnxnSocketMethod;
- wakeupCnxnMethod = localWakeupCnxnMethod;
}
public static void injectSessionExpiration(ZooKeeper zooKeeper)
@@ -88,11 +66,8 @@ public class InjectSessionExpiration
ClientCnxn clientCnxn = (ClientCnxn)cnxnField.get(zooKeeper);
Object eventThread = eventThreadField.get(clientCnxn);
queueEventMethod.invoke(eventThread, event);
- queueEventOfDeathMethod.invoke(eventThread);
- // we used to set the state field to CLOSED here but this resulted in CURATOR-498
- Object sendThread = sendThreadField.get(clientCnxn);
- Object clientCnxnSocket = getClientCnxnSocketMethod.invoke(sendThread);
- wakeupCnxnMethod.invoke(clientCnxnSocket);
+
+ // we used to set the state field to CLOSED here and a few other things but this resulted in CURATOR-498
}
catch ( ReflectiveOperationException e )
{
diff --git a/curator-client/src/test/java/org/apache/curator/BasicTests.java b/curator-client/src/test/java/org/apache/curator/BasicTests.java
index 2875f49..f951fb5 100644
--- a/curator-client/src/test/java/org/apache/curator/BasicTests.java
+++ b/curator-client/src/test/java/org/apache/curator/BasicTests.java
@@ -21,8 +21,8 @@ package org.apache.curator;
import org.apache.curator.ensemble.fixed.FixedEnsembleProvider;
import org.apache.curator.retry.RetryOneTime;
import org.apache.curator.test.BaseClassForTests;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.test.Timing;
+import org.apache.curator.utils.Compatibility;
import org.apache.curator.utils.ZookeeperFactory;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
@@ -100,7 +100,7 @@ public class BasicTests extends BaseClassForTests
// ignore
}
- KillSession2.kill(client.getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZooKeeper());
Assert.assertTrue(timing.awaitLatch(latch));
}
diff --git a/curator-client/src/test/java/org/apache/curator/TestSessionFailRetryLoop.java b/curator-client/src/test/java/org/apache/curator/TestSessionFailRetryLoop.java
index 39b0e45..7c9c963 100644
--- a/curator-client/src/test/java/org/apache/curator/TestSessionFailRetryLoop.java
+++ b/curator-client/src/test/java/org/apache/curator/TestSessionFailRetryLoop.java
@@ -20,9 +20,9 @@ package org.apache.curator;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.test.BaseClassForTests;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.utils.CloseableUtils;
import org.apache.curator.test.Timing;
+import org.apache.curator.utils.Compatibility;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.concurrent.Callable;
@@ -57,7 +57,7 @@ public class TestSessionFailRetryLoop extends BaseClassForTests
if ( firstTime.compareAndSet(true, false) )
{
Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
- KillSession2.kill(client.getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZooKeeper());
client.getZooKeeper();
client.blockUntilConnectedOrTimedOut();
}
@@ -131,7 +131,7 @@ public class TestSessionFailRetryLoop extends BaseClassForTests
if ( firstTime.compareAndSet(true, false) )
{
Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
- KillSession2.kill(client.getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZooKeeper());
client.getZooKeeper();
client.blockUntilConnectedOrTimedOut();
}
@@ -196,7 +196,7 @@ public class TestSessionFailRetryLoop extends BaseClassForTests
public Void call() throws Exception
{
Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
- KillSession2.kill(client.getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZooKeeper());
timing.sleepABit();
@@ -258,7 +258,7 @@ public class TestSessionFailRetryLoop extends BaseClassForTests
public Void call() throws Exception
{
Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
- KillSession2.kill(client.getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZooKeeper());
client.getZooKeeper();
client.blockUntilConnectedOrTimedOut();
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/ProtectedMode.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/ProtectedMode.java
index cd33ab0..5c2f052 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/ProtectedMode.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/ProtectedMode.java
@@ -30,9 +30,9 @@ import java.util.UUID;
class ProtectedMode
{
private final Logger log = LoggerFactory.getLogger(getClass());
- private boolean doProtected = false;
- private String protectedId = null;
- private long sessionId = 0;
+ private volatile boolean doProtected = false;
+ private volatile String protectedId = null;
+ private volatile long sessionId = 0;
/**
* Enable protected mode
@@ -95,16 +95,17 @@ class ProtectedMode
{
if ( doProtected && createMode.isEphemeral() )
{
- if ( sessionId != client.getZooKeeper().getSessionId() )
+ long clientSessionId = client.getZooKeeper().getSessionId();
+ if ( this.sessionId != clientSessionId )
{
- log.info("Session has changed during protected mode with ephemeral. old: {} new: {}", sessionId, client.getZooKeeper().getSessionId());
+ log.info("Session has changed during protected mode with ephemeral. old: {} new: {}", this.sessionId, clientSessionId);
if ( foundNode != null )
{
log.info("Deleted old session's found node: {}", foundNode);
client.getFailedDeleteManager().executeGuaranteedOperationInBackground(foundNode);
foundNode = null;
}
- sessionId = client.getZooKeeper().getSessionId();
+ this.sessionId = clientSessionId;
}
}
return foundNode;
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java
index e61ee9f..773d9c9 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java
@@ -25,9 +25,9 @@ import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.curator.retry.RetryOneTime;
import org.apache.curator.test.BaseClassForTests;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.test.compatibility.Timing2;
import org.apache.curator.utils.CloseableUtils;
+import org.apache.curator.utils.Compatibility;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
@@ -127,7 +127,7 @@ public class TestEnabledSessionExpiredState extends BaseClassForTests
{
Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
Assert.assertEquals(states.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java
index 066cee2..7c6d156 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java
@@ -40,9 +40,9 @@ import org.apache.curator.test.BaseClassForTests;
import org.apache.curator.test.InstanceSpec;
import org.apache.curator.test.TestingCluster;
import org.apache.curator.test.TestingServer;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.test.compatibility.Timing2;
import org.apache.curator.utils.CloseableUtils;
+import org.apache.curator.utils.Compatibility;
import org.apache.curator.utils.ZKPaths;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
@@ -92,7 +92,7 @@ public class TestFrameworkEdges extends BaseClassForTests
}
};
client.checkExists().usingWatcher(watcher).forPath("/foobar");
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
Assert.assertTrue(timing.awaitLatch(expiredLatch));
}
}
@@ -523,22 +523,18 @@ public class TestFrameworkEdges extends BaseClassForTests
{
client.create().forPath("/sessionTest");
- final AtomicBoolean sessionDied = new AtomicBoolean(false);
- Watcher watcher = new Watcher()
- {
- @Override
- public void process(WatchedEvent event)
+ CountDownLatch sessionDiedLatch = new CountDownLatch(1);
+ Watcher watcher = event -> {
+ if ( event.getState() == Watcher.Event.KeeperState.Expired )
{
- if ( event.getState() == Event.KeeperState.Expired )
- {
- sessionDied.set(true);
- }
+ sessionDiedLatch.countDown();
}
};
+
client.checkExists().usingWatcher(watcher).forPath("/sessionTest");
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
+ Assert.assertTrue(timing.awaitLatch(sessionDiedLatch));
Assert.assertNotNull(client.checkExists().forPath("/sessionTest"));
- Assert.assertTrue(sessionDied.get());
}
finally
{
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/state/TestConnectionStateManager.java b/curator-framework/src/test/java/org/apache/curator/framework/state/TestConnectionStateManager.java
index 97ea941..1bc9df3 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/state/TestConnectionStateManager.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/state/TestConnectionStateManager.java
@@ -69,4 +69,4 @@ public class TestConnectionStateManager extends BaseClassForTests {
CloseableUtils.closeQuietly(client);
}
}
-}
\ No newline at end of file
+}
diff --git a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/leader/LeaderLatch.java b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/leader/LeaderLatch.java
index bb8aa73..446b7cb 100644
--- a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/leader/LeaderLatch.java
+++ b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/leader/LeaderLatch.java
@@ -467,6 +467,12 @@ public class LeaderLatch implements Closeable
}
@VisibleForTesting
+ String getOurPath()
+ {
+ return ourPath.get();
+ }
+
+ @VisibleForTesting
volatile CountDownLatch debugResetWaitLatch = null;
@VisibleForTesting
@@ -524,8 +530,16 @@ public class LeaderLatch implements Closeable
}
}
+ @VisibleForTesting
+ volatile CountDownLatch debugCheckLeaderShipLatch = null;
+
private void checkLeadership(List<String> children) throws Exception
{
+ if ( debugCheckLeaderShipLatch != null )
+ {
+ debugCheckLeaderShipLatch.await();
+ }
+
final String localOurPath = ourPath.get();
List<String> sortedChildren = LockInternals.getSortedChildren(LOCK_NAME, sorter, children);
int ourIndex = (localOurPath != null) ? sortedChildren.indexOf(ZKPaths.getNodeFromPath(localOurPath)) : -1;
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/BaseTestTreeCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/BaseTestTreeCache.java
index b984624..175ccdf 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/BaseTestTreeCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/BaseTestTreeCache.java
@@ -26,7 +26,6 @@ import org.apache.curator.framework.imps.TestCleanState;
import org.apache.curator.retry.RetryOneTime;
import org.apache.curator.test.BaseClassForTests;
import org.apache.curator.test.Timing;
-import org.apache.curator.utils.CloseableExecutorService;
import org.apache.curator.utils.CloseableUtils;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
@@ -164,8 +163,20 @@ public class BaseTestTreeCache extends BaseClassForTests
*/
TreeCacheEvent assertEvent(TreeCacheEvent.Type expectedType, String expectedPath, byte[] expectedData) throws InterruptedException
{
+ return assertEvent(expectedType, expectedPath, expectedData, false);
+ }
+
+ TreeCacheEvent assertEvent(TreeCacheEvent.Type expectedType, String expectedPath, byte[] expectedData, boolean ignoreConnectionEvents) throws InterruptedException
+ {
TreeCacheEvent event = events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS);
Assert.assertNotNull(event, String.format("Expected type: %s, path: %s", expectedType, expectedPath));
+ if ( ignoreConnectionEvents )
+ {
+ if ( (event.getType() == TreeCacheEvent.Type.CONNECTION_SUSPENDED) || (event.getType() == TreeCacheEvent.Type.CONNECTION_LOST) || (event.getType() == TreeCacheEvent.Type.CONNECTION_RECONNECTED) )
+ {
+ return assertEvent(expectedType, expectedPath, expectedData, ignoreConnectionEvents);
+ }
+ }
String message = event.toString();
Assert.assertEquals(event.getType(), expectedType, message);
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestNodeCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestNodeCache.java
index 253c777..ff416d5 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestNodeCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestNodeCache.java
@@ -20,7 +20,6 @@ package org.apache.curator.framework.recipes.cache;
import org.apache.curator.framework.imps.TestCleanState;
import org.apache.curator.test.BaseClassForTests;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.test.compatibility.Timing2;
import org.apache.curator.utils.CloseableUtils;
import org.apache.curator.framework.CuratorFramework;
@@ -28,6 +27,7 @@ import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.UnhandledErrorListener;
import org.apache.curator.retry.RetryOneTime;
import org.apache.curator.test.Timing;
+import org.apache.curator.utils.Compatibility;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.concurrent.Callable;
@@ -196,7 +196,7 @@ public class TestNodeCache extends BaseClassForTests
}
);
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
Thread.sleep(timing.multiple(1.5).session());
Assert.assertEquals(cache.getCurrentData().getData(), "start".getBytes());
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCache.java
index edaac37..78fabd5 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCache.java
@@ -32,8 +32,8 @@ import org.apache.curator.test.BaseClassForTests;
import org.apache.curator.test.ExecuteCalledWatchingExecutorService;
import org.apache.curator.test.TestingServer;
import org.apache.curator.test.Timing;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.utils.CloseableUtils;
+import org.apache.curator.utils.Compatibility;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.testng.Assert;
@@ -190,11 +190,11 @@ public class TestPathChildrenCache extends BaseClassForTests
cache.getListenable().addListener(listener);
cache.start();
Assert.assertTrue(timing.awaitLatch(ensurePathLatch));
-
+
final CountDownLatch connectedLatch = new CountDownLatch(1);
client.getConnectionStateListenable().addListener(new ConnectionStateListener()
{
-
+
@Override
public void stateChanged(CuratorFramework client, ConnectionState newState)
{
@@ -206,7 +206,7 @@ public class TestPathChildrenCache extends BaseClassForTests
});
server = new TestingServer(serverPort, true);
-
+
Assert.assertTrue(timing.awaitLatch(connectedLatch));
client.create().creatingParentContainersIfNeeded().forPath("/baz", new byte[]{1, 2, 3});
@@ -814,7 +814,7 @@ public class TestPathChildrenCache extends BaseClassForTests
client.create().withMode(CreateMode.EPHEMERAL).forPath("/test/me", "data".getBytes());
Assert.assertTrue(timing.awaitLatch(childAddedLatch));
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
Assert.assertTrue(timing.awaitLatch(lostLatch));
Assert.assertTrue(timing.awaitLatch(reconnectedLatch));
Assert.assertTrue(timing.awaitLatch(removedLatch));
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
index 9631d12..1e97ce2 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
@@ -23,14 +23,12 @@ import com.google.common.collect.ImmutableSet;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.api.UnhandledErrorListener;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent.Type;
-import org.apache.curator.framework.state.ConnectionState;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.utils.CloseableUtils;
+import org.apache.curator.utils.Compatibility;
import org.apache.zookeeper.CreateMode;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
public class TestTreeCache extends BaseTestTreeCache
@@ -425,21 +423,9 @@ public class TestTreeCache extends BaseTestTreeCache
client.create().withMode(CreateMode.EPHEMERAL).forPath("/test/me", "data".getBytes());
assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test/me");
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
- if ( client.isZk34CompatibilityMode() )
- {
- assertEvent(TreeCacheEvent.Type.CONNECTION_LOST);
- assertEvent(TreeCacheEvent.Type.NODE_REMOVED, "/test/me", "data".getBytes());
- assertEvent(TreeCacheEvent.Type.CONNECTION_RECONNECTED);
- assertEvent(TreeCacheEvent.Type.INITIALIZED);
- }
- else
- {
- assertEvent(TreeCacheEvent.Type.CONNECTION_LOST);
- assertEvent(TreeCacheEvent.Type.CONNECTION_RECONNECTED);
- assertEvent(TreeCacheEvent.Type.INITIALIZED);
- assertEvent(TreeCacheEvent.Type.NODE_REMOVED, "/test/me", "data".getBytes());
- }
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
+ assertEvent(TreeCacheEvent.Type.NODE_REMOVED, "/test/me", "data".getBytes(), true);
+ assertEvent(TreeCacheEvent.Type.INITIALIZED, null, null, true);
assertNoMoreEvents();
}
@@ -483,7 +469,6 @@ public class TestTreeCache extends BaseTestTreeCache
client.create().forPath("/test");
client.create().forPath("/test/one", "hey there".getBytes());
-
cache = buildWithListeners(TreeCache.newBuilder(client, "/test").disableZkWatches(true));
cache.start();
@@ -620,7 +605,8 @@ public class TestTreeCache extends BaseTestTreeCache
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception
{
- if (event.getType() == Type.NODE_UPDATED) {
+ if ( event.getType() == Type.NODE_UPDATED )
+ {
throw new RuntimeException("Test Exception");
}
}
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java
index 011e4a0..e3e0aeb 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java
@@ -70,6 +70,40 @@ public class TestLeaderLatch extends BaseClassForTests
}
@Test
+ public void testWatchedNodeDeletedOnReconnect() throws Exception
+ {
+ final String latchPath = "/foo/bar";
+ Timing timing = new Timing();
+ try ( CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)) )
+ {
+ client.start();
+ try (LeaderLatch latch1 = new LeaderLatch(client, latchPath) )
+ {
+ latch1.start();
+ latch1.await();
+
+ try ( LeaderLatch latch2 = new LeaderLatch(client, latchPath) )
+ {
+ latch2.start(); // will get a watcher on latch1's node
+ timing.sleepABit();
+
+ latch2.debugCheckLeaderShipLatch = new CountDownLatch(1);
+ client.delete().forPath(latch1.getOurPath()); // simulate the leader's path getting deleted
+ timing.sleepABit(); // after this, latch2 should be blocked just before getting the path in checkLeadership()
+
+ latch2.reset(); // force the internal "ourPath" to get reset
+ latch2.debugCheckLeaderShipLatch.countDown(); // allow checkLeadership() to continue
+
+ Assert.assertTrue(latch2.await(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
+
+ Assert.assertEquals(client.getChildren().forPath(latchPath).size(), 1);
+ Assert.assertEquals(latch1.getLeader(), latch2.getLeader());
+ }
+ }
+ }
+ }
+
+ @Test
public void testSessionErrorPolicy() throws Exception
{
Timing timing = new Timing();
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelector.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelector.java
index 9a5e42e..b92c3a2 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelector.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelector.java
@@ -24,7 +24,6 @@ import com.google.common.collect.Queues;
import com.google.common.collect.Sets;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.curator.framework.state.SessionConnectionStateErrorPolicy;
@@ -33,14 +32,11 @@ import org.apache.curator.retry.RetryOneTime;
import org.apache.curator.test.BaseClassForTests;
import org.apache.curator.test.TestingServer;
import org.apache.curator.test.Timing;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.test.compatibility.Timing2;
import org.apache.curator.utils.CloseableUtils;
-import org.apache.curator.utils.ZKPaths;
+import org.apache.curator.utils.Compatibility;
import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
-import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
@@ -535,7 +531,7 @@ public class TestLeaderSelector extends BaseClassForTests
Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
Assert.assertTrue(timing.awaitLatch(interruptedLatch));
timing.sleepABit();
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutex.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutex.java
index 8ab2dc5..e9645e8 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutex.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutex.java
@@ -26,8 +26,8 @@ import org.apache.curator.framework.imps.TestCleanState;
import org.apache.curator.framework.schema.Schema;
import org.apache.curator.framework.schema.SchemaSet;
import org.apache.curator.retry.RetryOneTime;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.utils.CloseableUtils;
+import org.apache.curator.utils.Compatibility;
import org.apache.zookeeper.CreateMode;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -172,7 +172,7 @@ public class TestInterProcessMutex extends TestInterProcessMutexBase
Assert.assertTrue(lock.isAcquiredInThisProcess());
// Kill the session, check that lock node still exists
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
Assert.assertNotNull(client.checkExists().forPath(LOCK_PATH));
// Release the lock and verify that the actual lock node created no longer exists
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutexBase.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutexBase.java
index cf44daf..0c62650 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutexBase.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutexBase.java
@@ -27,11 +27,11 @@ import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.test.BaseClassForTests;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.test.TestingServer;
import org.apache.curator.test.Timing;
import org.apache.curator.test.compatibility.Timing2;
import org.apache.curator.utils.CloseableUtils;
+import org.apache.curator.utils.Compatibility;
import org.apache.curator.utils.ZKPaths;
import org.apache.zookeeper.KeeperException;
import org.testng.Assert;
@@ -200,7 +200,7 @@ public abstract class TestInterProcessMutexBase extends BaseClassForTests
);
Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
Assert.assertTrue(timing.forSessionSleep().acquireSemaphore(semaphore, 1));
}
finally
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
index 03665c5..87585af 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
@@ -31,9 +31,9 @@ import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.curator.retry.RetryOneTime;
import org.apache.curator.test.BaseClassForTests;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.test.compatibility.Timing2;
import org.apache.curator.utils.CloseableUtils;
+import org.apache.curator.utils.Compatibility;
import org.apache.curator.utils.ZKPaths;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
@@ -329,7 +329,7 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
observer.checkExists().usingWatcher(deletedTrigger).forPath(node.getActualPath());
node.debugCreateNodeLatch = new CountDownLatch(1);
- KillSession2.kill(curator.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(curator.getZookeeperClient().getZooKeeper());
// Make sure the node got deleted
assertTrue(deletedTrigger.firedWithin(timing.forSessionSleep().seconds(), TimeUnit.SECONDS));
@@ -359,7 +359,7 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
observer.checkExists().usingWatcher(deletedTrigger).forPath(node.getActualPath());
node.debugCreateNodeLatch = new CountDownLatch(1);
- KillSession2.kill(curator.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(curator.getZookeeperClient().getZooKeeper());
// Make sure the node got deleted...
assertTrue(deletedTrigger.firedWithin(timing.forSessionSleep().seconds(), TimeUnit.SECONDS));
@@ -400,7 +400,7 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
node.debugCreateNodeLatch = new CountDownLatch(1);
// Kill the session, thus cleaning up the node...
- KillSession2.kill(curator.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(curator.getZookeeperClient().getZooKeeper());
// Make sure the node ended up getting deleted...
assertTrue(deletionTrigger.firedWithin(timing.multiple(1.5).forSessionSleep().seconds(), TimeUnit.SECONDS));
@@ -443,7 +443,7 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
Trigger deletedTrigger = Trigger.deletedOrSetData();
observer.checkExists().usingWatcher(deletedTrigger).forPath(node.getActualPath());
- KillSession2.kill(nodeCreator.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(nodeCreator.getZookeeperClient().getZooKeeper());
// Make sure the node got deleted...
assertTrue(deletedTrigger.firedWithin(timing.forWaiting().seconds(), TimeUnit.SECONDS));
@@ -536,10 +536,10 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
CloseableUtils.closeQuietly(node);
}
}
-
+
/**
* Test that if a persistent ephemeral node is created and the node already exists
- * that if data is present in the PersistentEphermalNode that it is still set.
+ * that if data is present in the PersistentEphermalNode that it is still set.
* @throws Exception
*/
@Test
@@ -547,9 +547,9 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
{
CuratorFramework curator = newCurator();
curator.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(PATH, "InitialData".getBytes());
-
+
byte[] data = "Hello World".getBytes();
-
+
PersistentEphemeralNode node = new PersistentEphemeralNode(curator, PersistentEphemeralNode.Mode.EPHEMERAL, PATH, data);
node.debugWaitMsForBackgroundBeforeClose.set(timing.forSleepingABit().milliseconds());
try
@@ -568,10 +568,10 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
public void testSetDataWhenDisconnected() throws Exception
{
CuratorFramework curator = newCurator();
-
+
byte[] initialData = "Hello World".getBytes();
byte[] updatedData = "Updated".getBytes();
-
+
PersistentEphemeralNode node = new PersistentEphemeralNode(curator, PersistentEphemeralNode.Mode.EPHEMERAL, PATH, initialData);
try
{
@@ -579,11 +579,11 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
node.start();
node.waitForInitialCreate(timing.forWaiting().seconds(), TimeUnit.SECONDS);
assertTrue(Arrays.equals(curator.getData().forPath(node.getActualPath()), initialData));
-
+
server.stop();
-
+
final CountDownLatch dataUpdateLatch = new CountDownLatch(1);
-
+
Watcher watcher = new Watcher()
{
@Override
@@ -593,22 +593,22 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
{
dataUpdateLatch.countDown();
}
- }
+ }
};
-
+
curator.getData().usingWatcher(watcher).inBackground().forPath(node.getActualPath());
-
+
node.setData(updatedData);
server.restart();
assertTrue(timing.awaitLatch(dataUpdateLatch));
-
+
assertTrue(Arrays.equals(curator.getData().forPath(node.getActualPath()), updatedData));
}
finally
{
CloseableUtils.closeQuietly(node);
- }
+ }
}
@Test
@@ -650,7 +650,7 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
CloseableUtils.closeQuietly(node);
}
}
-
+
/**
* See CURATOR-190
* For protected nodes on reconnect the current protected name was passed to the create builder meaning that it got
@@ -671,12 +671,12 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
node.waitForInitialCreate(timing.forWaiting().seconds(), TimeUnit.SECONDS);
assertNodeExists(curator, node.getActualPath());
- server.restart();
-
+ server.restart();
+
curator.blockUntilConnected(5, TimeUnit.SECONDS);
assertNodeExists(curator, node.getActualPath());
-
+
//There should only be a single child, the persisted ephemeral node
List<String> children = curator.getChildren().forPath(DIR);
assertFalse(children == null);
@@ -687,7 +687,7 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
CloseableUtils.closeQuietly(node);
}
}
-
+
@Test
public void testNoCreatePermission() throws Exception
{
@@ -709,12 +709,12 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
//New client without authentication
client = newCurator();
-
+
node = new PersistentEphemeralNode(client, PersistentEphemeralNode.Mode.EPHEMERAL, PATH,
new byte[0]);
node.debugWaitMsForBackgroundBeforeClose.set(timing.forSleepingABit().milliseconds());
node.start();
-
+
node.waitForInitialCreate(timing.seconds(), TimeUnit.SECONDS);
assertNodeDoesNotExist(client, PATH);
assertTrue(node.isAuthFailure());
diff --git a/curator-test-zk34/src/test/java/org/apache/curator/test/Compatibility.java b/curator-test-zk34/src/test/java/org/apache/curator/test/Compatibility.java
index bebd7c9..a30b870 100644
--- a/curator-test-zk34/src/test/java/org/apache/curator/test/Compatibility.java
+++ b/curator-test-zk34/src/test/java/org/apache/curator/test/Compatibility.java
@@ -18,18 +18,10 @@
*/
package org.apache.curator.test;
-import org.apache.curator.utils.InjectSessionExpiration;
-import org.apache.zookeeper.ZooKeeper;
-
public class Compatibility
{
public static boolean isZK34()
{
return true;
}
-
- public static void injectSessionExpiration(ZooKeeper zooKeeper)
- {
- InjectSessionExpiration.injectSessionExpiration(zooKeeper);
- }
}
diff --git a/curator-test/src/main/java/org/apache/curator/test/Compatibility.java b/curator-test/src/main/java/org/apache/curator/test/Compatibility.java
index 4fc63df..5b4b53f 100644
--- a/curator-test/src/main/java/org/apache/curator/test/Compatibility.java
+++ b/curator-test/src/main/java/org/apache/curator/test/Compatibility.java
@@ -18,17 +18,10 @@
*/
package org.apache.curator.test;
-import org.apache.zookeeper.ZooKeeper;
-
public class Compatibility
{
public static boolean isZK34()
{
return false;
}
-
- public static void injectSessionExpiration(ZooKeeper zooKeeper)
- {
- zooKeeper.getTestable().injectSessionExpiration();
- }
}
diff --git a/curator-test/src/main/java/org/apache/curator/test/compatibility/KillSession2.java b/curator-test/src/main/java/org/apache/curator/test/compatibility/KillSession2.java
deleted file mode 100644
index d747d3d..0000000
--- a/curator-test/src/main/java/org/apache/curator/test/compatibility/KillSession2.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.curator.test.compatibility;
-
-import org.apache.curator.test.Compatibility;
-import org.apache.zookeeper.ZooKeeper;
-
-/**
- * <p>
- * Utility to simulate a ZK session dying.
- * </p>
- */
-public class KillSession2
-{
- /**
- * Kill the given ZK session
- *
- * @param client the client to kill
- */
- public static void kill(ZooKeeper client)
- {
- Compatibility.injectSessionExpiration(client);
- }
-}
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscovery.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscovery.java
index b67bff9..54719a5 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscovery.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscovery.java
@@ -25,9 +25,9 @@ import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryOneTime;
import org.apache.curator.test.BaseClassForTests;
-import org.apache.curator.test.compatibility.KillSession2;
import org.apache.curator.test.Timing;
import org.apache.curator.utils.CloseableUtils;
+import org.apache.curator.utils.Compatibility;
import org.apache.curator.x.discovery.ServiceDiscovery;
import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
import org.apache.curator.x.discovery.ServiceInstance;
@@ -79,7 +79,7 @@ public class TestServiceDiscovery extends BaseClassForTests
timing.acquireSemaphore(semaphore, 2);
Assert.assertEquals(discovery.queryForInstances("test").size(), 2);
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
server.stop();
server.restart();
@@ -121,7 +121,7 @@ public class TestServiceDiscovery extends BaseClassForTests
timing.acquireSemaphore(semaphore);
Assert.assertEquals(discovery.queryForInstances("test").size(), 1);
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
server.stop();
server.restart();
@@ -154,7 +154,7 @@ public class TestServiceDiscovery extends BaseClassForTests
Assert.assertEquals(discovery.queryForInstances("test").size(), 1);
- KillSession2.kill(client.getZookeeperClient().getZooKeeper());
+ Compatibility.injectSessionExpiration(client.getZookeeperClient().getZooKeeper());
Thread.sleep(timing.multiple(1.5).session());
Assert.assertEquals(discovery.queryForInstances("test").size(), 1);