Hi all,

Any thoughts on this?

Curator has similar issue reported as CURATOR-666[1]. I think it might be
worth to get Curator and ZooKeeper behave same in `getConfig`.

I replied this also to dev@curator for joint discussion. See my quotes and
ZOOKEEPER-4565[2], ZOOKEEPER-4601[3] for context.

[1]: https://issues.apache.org/jira/browse/CURATOR-666
[2]: https://issues.apache.org/jira/browse/ZOOKEEPER-4565
[3]: https://issues.apache.org/jira/browse/ZOOKEEPER-4601

On Wed, Jul 27, 2022 at 8:35 PM Kezhu Wang <kez...@gmail.com> wrote:

> Hi Devs,
>
> Before ZOOKEEPER-4565[1], `ClientCnxn` uses following code to strip chroot:
>
> ```
> // convert from a server path to a client path
> if (chrootPath != null) {
>     String serverPath = event.getPath();
>     if (serverPath.compareTo(chrootPath) == 0) {
>         event.setPath("/");
>     } else if (serverPath.length() > chrootPath.length()) {
>         event.setPath(serverPath.substring(chrootPath.length()));
>     } else {
>         LOG.warn("Got server path {} which is too short for chroot path
> {}.",
>             event.getPath(), chrootPath);
>     }
> }
> ```
>
> This results in behavior:
> * For chroot "/zookeeper", watcher will receive event path "/config".
> * For chroot "/short", watcher will receive illegal path "eper/config".
> This causes in ZOOKEEPER-4601.
> * For chroot "/pretty-long-chroot-path", watcher will receive event path
> "/zookeeper/config".
>
> ZOOKEEPEER-4601 changed the stripping code to fix illegal path:
>
> ```
> private String stripChroot(String serverPath) {
>     if (serverPath.startsWith(chrootPath)) {
>         if (serverPath.length() == chrootPath.length()) {
>             return "/";
>         }
>         return serverPath.substring(chrootPath.length());
>     } else if (serverPath.startsWith(ZooDefs.ZOOKEEPER_NODE_SUBTREE)) {
>         return serverPath;
>     }
>     LOG.warn("Got server path {} which is not descendant of chroot path
> {}.", serverPath, chrootPath);
>     return serverPath;
> }
> ```
>
> This results in behavior:
> * For chroot "/zookeeper", watcher will receive event path "/config".
> * For chroot "/other-chroot"(eg. "/short", "/pretty-long-chroot-path",
> etc.), watcher will receive event path "/zookeeper/config".
>
> The path `getConfig` watcher received was not changed in ZOOKEEPER-4565.
>
> It is a bit of surprising to me that event path of `getConfig` watcher is
> not "/zookeeper/config" . I guess the current behavior might not be by
> design. Personally, I prefer to `getConfig` watchers(whether it is the
> default one or not) to receive path "/zookeeper/config". But, obviously,
> such change is a breaking change in behavior(though might not be by design)
> of public API. @eolivelli mentioned that such a change needs a mailing list
> decision, so I post it here for discussion in addition to ZOOKEEPER-4601[2].
>
> Any thoughts ?
>
> [1]: https://issues.apache.org/jira/browse/ZOOKEEPER-4565
> [2]: https://issues.apache.org/jira/browse/ZOOKEEPER-4601
>
>
> Best,
> Kezhu Wang
>


-- 
Best,
Kezhu Wang

Reply via email to