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

Reply via email to