Jialin Chen created ZOOKEEPER-5105:
--------------------------------------
Summary: zkCli addWatch reuses the mode of a previous invocation
when -m is omitted
Key: ZOOKEEPER-5105
URL: https://issues.apache.org/jira/browse/ZOOKEEPER-5105
Project: ZooKeeper
Issue Type: Bug
Components: java client
Affects Versions: 3.10.0, 3.8.7, 3.9.6
Reporter: Jialin Chen
zkCli keeps a single instance of each CLI command for the whole session, and
{{AddWatchCommand.parse()}} only assigns the {{mode}} field when {{-m}} is
given. After an {{addWatch -m PERSISTENT ...}}, every later {{addWatch}}
without {{-m}} in the same session registers a {{PERSISTENT}} watch instead of
the default {{PERSISTENT_RECURSIVE}} that the usage text announces ("default is
PERSISTENT_RECURSIVE").
Steps to reproduce (standalone server built from master at 48f7cb00e):
{noformat}
[zk: localhost:22181(CONNECTED) 0] create /w1 x
[zk: localhost:22181(CONNECTED) 1] create /w2 x
[zk: localhost:22181(CONNECTED) 2] addWatch -m PERSISTENT /w1
[zk: localhost:22181(CONNECTED) 3] addWatch /w2
[zk: localhost:22181(CONNECTED) 4] create /w2/c x
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/w2 zxid: 35
{noformat}
Expected: {{addWatch /w2}} registers a persistent recursive watch, so creating
{{/w2/c}} fires {{NodeCreated path:/w2/c}}. This is what a fresh session gets:
{noformat}
[zk: localhost:22181(CONNECTED) 0] create /w3 x
[zk: localhost:22181(CONNECTED) 1] addWatch /w3
[zk: localhost:22181(CONNECTED) 2] create /w3/c x
WatchedEvent state:SyncConnected type:NodeCreated path:/w3/c zxid: 38
{noformat}
Actual: the watch on {{/w2}} is a plain persistent watch, so only
{{NodeChildrenChanged path:/w2}} fires.
The behaviour dates back to the introduction of the command in ZOOKEEPER-1416
(3.6.0). {{ReconfigCommand.parse()}} already resets its per-invocation fields
for the same reason; {{AddWatchCommand.parse()}} should fall back to the
default mode when {{-m}} is absent.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)