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: + * */ 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: + * */ 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: + * */ 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: + * */ 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: + * */ 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: + * */ 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: + * */ 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: + * */ 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: + * * @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: + * */ 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);