diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java b/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java
index 127f5a2a3f3..281355b1ac4 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java
@@ -442,7 +442,12 @@ public boolean isConnected() {
* @throws IOException
* in cases of network failure
* @throws IllegalArgumentException
- * if an invalid chroot path is specified
+ * if any of the following is true:
+ *
+ * - if an invalid chroot path is specified
+ *
- for an invalid list of ZooKeeper hosts
+ *
- watcher is null
+ *
*/
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) throws IOException {
this(connectString, sessionTimeout, watcher, false);
@@ -491,7 +496,12 @@ public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) thro
* @throws IOException
* in cases of network failure
* @throws IllegalArgumentException
- * if an invalid chroot path is specified
+ * if any of the following is true:
+ *
+ * - if an invalid chroot path is specified
+ *
- for an invalid list of ZooKeeper hosts
+ *
- watcher is null
+ *
*/
public ZooKeeper(
String connectString,
@@ -556,7 +566,12 @@ public ZooKeeper(
* @throws IOException
* in cases of network failure
* @throws IllegalArgumentException
- * if an invalid chroot path is specified
+ * if any of the following is true:
+ *
+ * - if an invalid chroot path is specified
+ *
- for an invalid list of ZooKeeper hosts
+ *
- watcher is null
+ *
*/
public ZooKeeper(
String connectString,
@@ -624,7 +639,12 @@ public ZooKeeper(
* @throws IOException
* in cases of network failure
* @throws IllegalArgumentException
- * if an invalid chroot path is specified
+ * if any of the following is true:
+ *
+ * - if an invalid chroot path is specified
+ *
- for an invalid list of ZooKeeper hosts
+ *
- watcher is null
+ *
*/
public ZooKeeper(
String connectString,
@@ -640,6 +660,7 @@ public ZooKeeper(
sessionTimeout,
watcher);
+ validateWatcher(watcher);
this.clientConfig = clientConfig != null ? clientConfig : new ZKClientConfig();
this.hostProvider = hostProvider;
ConnectStringParser connectStringParser = new ConnectStringParser(connectString);
@@ -724,7 +745,12 @@ ClientCnxn createConnection(
* @throws IOException
* in cases of network failure
* @throws IllegalArgumentException
- * if an invalid chroot path is specified
+ * if any of the following is true:
+ *
+ * - if an invalid chroot path is specified
+ *
- for an invalid list of ZooKeeper hosts
+ *
- watcher is null
+ *
*/
public ZooKeeper(
String connectString,
@@ -786,7 +812,12 @@ public ZooKeeper(
* @throws IOException
* in cases of network failure
* @throws IllegalArgumentException
- * if an invalid chroot path is specified
+ * if any of the following is true:
+ *
+ * - if an invalid chroot path is specified
+ *
- for an invalid list of ZooKeeper hosts
+ *
- watcher is null
+ *
*/
public ZooKeeper(
String connectString,
@@ -852,8 +883,13 @@ public ZooKeeper(
* password for this session
*
* @throws IOException in cases of network failure
- * @throws IllegalArgumentException if an invalid chroot path is specified
- * @throws IllegalArgumentException for an invalid list of ZooKeeper hosts
+ * @throws IllegalArgumentException
+ * if any of the following is true:
+ *
+ * - if an invalid chroot path is specified
+ *
- for an invalid list of ZooKeeper hosts
+ *
- watcher is null
+ *
*/
public ZooKeeper(
String connectString,
@@ -926,7 +962,13 @@ public ZooKeeper(
* @param aHostProvider
* use this as HostProvider to enable custom behaviour.
* @throws IOException in cases of network failure
- * @throws IllegalArgumentException if an invalid chroot path is specified
+ * @throws IllegalArgumentException
+ * if any of the following is true:
+ *
+ * - if an invalid chroot path is specified
+ *
- for an invalid list of ZooKeeper hosts
+ *
- watcher is null
+ *
*/
public ZooKeeper(
String connectString,
@@ -1013,7 +1055,12 @@ public ZooKeeper(
* configuring properties differently compared to other instances
* @throws IOException in cases of network failure
* @throws IllegalArgumentException if an invalid chroot path is specified
- *
+ * if any of the following is true:
+ *
+ * - if an invalid chroot path is specified
+ *
- for an invalid list of ZooKeeper hosts
+ *
- watcher is null
+ *
* @since 3.5.5
*/
public ZooKeeper(
@@ -1034,6 +1081,7 @@ public ZooKeeper(
Long.toHexString(sessionId),
(sessionPasswd == null ? "" : ""));
+ validateWatcher(watcher);
this.clientConfig = clientConfig != null ? clientConfig : new ZKClientConfig();
ConnectStringParser connectStringParser = new ConnectStringParser(connectString);
this.hostProvider = hostProvider;
@@ -1111,7 +1159,13 @@ public ZooKeeper(
* allowed while write requests are not. It continues seeking for
* majority in the background.
* @throws IOException in cases of network failure
- * @throws IllegalArgumentException if an invalid chroot path is specified
+ * @throws IllegalArgumentException
+ * if any of the following is true:
+ *
+ * - if an invalid chroot path is specified
+ *
- for an invalid list of ZooKeeper hosts
+ *
- watcher is null
+ *
*/
public ZooKeeper(
String connectString,
@@ -1194,8 +1248,10 @@ public void addAuthInfo(String scheme, byte[] auth) {
/**
* Specify the default watcher for the connection (overrides the one
* specified during construction).
+ * @throws IllegalArgumentException if watcher is null
*/
public synchronized void register(Watcher watcher) {
+ validateWatcher(watcher);
getWatchManager().setDefaultWatcher(watcher);
}
diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/ZooKeeperTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/ZooKeeperTest.java
index c829e85da2a..9d45802bbfc 100644
--- a/zookeeper-server/src/test/java/org/apache/zookeeper/ZooKeeperTest.java
+++ b/zookeeper-server/src/test/java/org/apache/zookeeper/ZooKeeperTest.java
@@ -815,4 +815,27 @@ public void testKeeperExceptionCreateNPE() {
assertThrows(IllegalArgumentException.class, () -> KeeperException.create(Code.get(Integer.MAX_VALUE)));
}
+ @Test
+ public void testInvalidWatcherRegistration() throws Exception {
+ String nullWatcherMsg = "Invalid Watcher, shouldn't be null!";
+ final ZooKeeper zk = createClient();
+ try {
+ zk.register(null);
+ fail("Should validate null watcher!");
+ } catch (IllegalArgumentException iae) {
+ assertEquals(nullWatcherMsg, iae.getMessage());
+ }
+ try {
+ new ZooKeeper(hostPort, 10000, null, false);
+ fail("Should validate null watcher!");
+ } catch (IllegalArgumentException iae) {
+ assertEquals(nullWatcherMsg, iae.getMessage());
+ }
+ try {
+ new ZooKeeper(hostPort, 10000, null, 10L, "".getBytes(), false);
+ fail("Should validate null watcher!");
+ } catch (IllegalArgumentException iae) {
+ assertEquals(nullWatcherMsg, iae.getMessage());
+ }
+ }
}
diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumDigestTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumDigestTest.java
index af2fed8cf88..a9e65a44574 100644
--- a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumDigestTest.java
+++ b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumDigestTest.java
@@ -204,7 +204,7 @@ private void startServers(List sids) throws InterruptedException {
private void triggerOps(int sid, String prefix) throws Exception {
TxnLogDigestTest.performOperations(servers.zk[sid], prefix);
- servers.restartClient(sid, null);
+ servers.restartClient(sid, event -> { });
waitForOne(servers.zk[sid], States.CONNECTED);
}
diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/test/ObserverMasterTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ObserverMasterTest.java
index 4ba33c7a854..ab30a1de047 100644
--- a/zookeeper-server/src/test/java/org/apache/zookeeper/test/ObserverMasterTest.java
+++ b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ObserverMasterTest.java
@@ -213,7 +213,7 @@ public void testRevalidation(boolean testObserverMaster) throws Exception {
public void testInOrderCommits(boolean testObserverMaster) throws Exception {
setUp(-1, testObserverMaster);
- zk = new ZooKeeper("127.0.0.1:" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT, null);
+ zk = new ZooKeeper("127.0.0.1:" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT, event -> { });
for (int i = 0; i < 10; i++) {
zk.create("/bulk"
+ i, ("Initial data of some size").getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);