From 89dae72b0eece22548305feb8bb1b77c9ebc7b21 Mon Sep 17 00:00:00 2001 From: EL MAJ Date: Wed, 20 May 2026 09:01:45 +0200 Subject: [PATCH] ZOOKEEPER-5051: Avoid NPE closing 4lw connection during startup --- .../org/apache/zookeeper/server/ZooKeeperServer.java | 5 ++++- .../apache/zookeeper/server/ZooKeeperServerTest.java | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooKeeperServer.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooKeeperServer.java index 080f4f8638d..f424569980c 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooKeeperServer.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooKeeperServer.java @@ -330,7 +330,10 @@ protected enum State { private final AuthenticationHelper authHelper = new AuthenticationHelper(); void removeCnxn(ServerCnxn cnxn) { - zkDb.removeCnxn(cnxn); + ZKDatabase db = zkDb; + if (db != null) { + db.removeCnxn(cnxn); + } } /** diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/server/ZooKeeperServerTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/server/ZooKeeperServerTest.java index 6a6cfd7ab59..72168fe2abd 100644 --- a/zookeeper-server/src/test/java/org/apache/zookeeper/server/ZooKeeperServerTest.java +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/server/ZooKeeperServerTest.java @@ -225,4 +225,14 @@ public void testUpdateQuotaExceededMetrics() { public void testUpdateQuotaExceededMetrics_nullNamespace() { assertDoesNotThrow(() -> ZooKeeperServer.updateQuotaExceededMetrics(null)); } + + @Test + public void testRemoveCnxnBeforeStartData() { + // Simulate a connection cleanup triggered before the server has fully started. + // During this phase zkDb is still null (before startdata()). + // 4-letter commands can hit this path. + ZooKeeperServer zks = new ZooKeeperServer(); + ServerCnxn cnxn = mock(ServerCnxn.class); + assertDoesNotThrow(() -> zks.removeCnxn(cnxn)); + } }