From 5a201d633fd90a14ba76795683be36b05baedff0 Mon Sep 17 00:00:00 2001 From: 1fanwang <1fannnw@gmail.com> Date: Tue, 25 Aug 2026 02:50:59 -0400 Subject: [PATCH] ZOOKEEPER-4947: Close clients after authentication failure ZooKeeper.close() treated AUTH_FAILED clients as already closed and skipped prompt shutdown of their connection threads. Signed-off-by: 1fanwang <1fannnw@gmail.com> --- .../src/main/java/org/apache/zookeeper/ZooKeeper.java | 2 +- .../org/apache/zookeeper/test/SaslAuthFailTest.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) 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 239f97b0f70..20e8e2cddd2 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java @@ -1319,7 +1319,7 @@ public synchronized void register(Watcher watcher) { * @throws InterruptedException */ public synchronized void close() throws InterruptedException { - if (!cnxn.getState().isAlive()) { + if (cnxn.getState() == States.CLOSED) { LOG.debug("Close called on already closed client"); return; } diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/test/SaslAuthFailTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/test/SaslAuthFailTest.java index 2384cd612ef..3f586c247d3 100644 --- a/zookeeper-server/src/test/java/org/apache/zookeeper/test/SaslAuthFailTest.java +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/test/SaslAuthFailTest.java @@ -18,11 +18,14 @@ package org.apache.zookeeper.test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher.Event.KeeperState; @@ -88,9 +91,12 @@ public void testAuthFail() { @Test public void testBadSaslAuthNotifiesWatch() throws Exception { - try (ZooKeeper ignored = createClient(new MyWatcher(), hostPort)) { + try (ZooKeeper zk = createClient(new MyWatcher(), hostPort)) { // wait for authFailed event from client's EventThread. - authFailed.await(); + assertTrue(authFailed.await(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)); + zk.close(); + assertEquals(ZooKeeper.States.CLOSED, zk.getState()); + assertTrue(zk.close(CONNECTION_TIMEOUT)); } }