From 4e039dbcb2381a9270854a657a6e18c4184e33a2 Mon Sep 17 00:00:00 2001 From: jjtt <3908945+jjtt@users.noreply.github.com> Date: Wed, 5 Mar 2025 13:17:35 +0200 Subject: [PATCH 1/2] Use create2 only when required If the client is not requesting stat, then the basic create operation is enough. This makes the client library compatible with servers that do not implement all ZooKeeper protocol features. Concretely, ClickHouse keeper does not implement create2. --- .../java/org/apache/zookeeper/ZooKeeper.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 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 5d85623d9b6..885c4b2ed0f 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java @@ -1490,7 +1490,7 @@ public String create( final String serverPath = prependChroot(clientPath); RequestHeader h = new RequestHeader(); - setCreateHeader(createMode, h); + setCreateHeader(createMode, h, stat != null); Create2Response response = new Create2Response(); Record record = makeCreateRecord(createMode, serverPath, data, acl, ttl); ReplyHeader r = cnxn.submitRequest(h, record, response, null); @@ -1503,11 +1503,19 @@ public String create( return chroot.strip(response.getPath()); } - private void setCreateHeader(CreateMode createMode, RequestHeader h) { + private void setCreateHeader(CreateMode createMode, RequestHeader h, boolean requestStat) { if (createMode.isTTL()) { h.setType(ZooDefs.OpCode.createTTL); } else { - h.setType(createMode.isContainer() ? ZooDefs.OpCode.createContainer : ZooDefs.OpCode.create2); + if (createMode.isContainer()) { + h.setType(ZooDefs.OpCode.createContainer); + } else { + if (requestStat) { + h.setType(ZooDefs.OpCode.create2); + } else { + h.setType(ZooDefs.OpCode.create); + } + } } } @@ -1599,7 +1607,7 @@ public void create( cb = chroot.interceptCallback(cb); RequestHeader h = new RequestHeader(); - setCreateHeader(createMode, h); + setCreateHeader(createMode, h, false); ReplyHeader r = new ReplyHeader(); Create2Response response = new Create2Response(); Record record = makeCreateRecord(createMode, serverPath, data, acl, ttl); From 5065b64b60478e0eac57478218ad3f870b3e64ed Mon Sep 17 00:00:00 2001 From: jjtt <3908945+jjtt@users.noreply.github.com> Date: Fri, 14 Mar 2025 09:20:57 +0200 Subject: [PATCH 2/2] fixup! Use create2 only when required --- .../main/java/org/apache/zookeeper/ZooKeeper.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 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 885c4b2ed0f..9752b552c65 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java @@ -1506,16 +1506,12 @@ public String create( private void setCreateHeader(CreateMode createMode, RequestHeader h, boolean requestStat) { if (createMode.isTTL()) { h.setType(ZooDefs.OpCode.createTTL); + } else if (createMode.isContainer()) { + h.setType(ZooDefs.OpCode.createContainer); + } else if (requestStat) { + h.setType(ZooDefs.OpCode.create2); } else { - if (createMode.isContainer()) { - h.setType(ZooDefs.OpCode.createContainer); - } else { - if (requestStat) { - h.setType(ZooDefs.OpCode.create2); - } else { - h.setType(ZooDefs.OpCode.create); - } - } + h.setType(ZooDefs.OpCode.create); } }