[
https://issues.apache.org/jira/browse/ZOOKEEPER-2052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14170185#comment-14170185
]
Hongchao Deng commented on ZOOKEEPER-2052:
------------------------------------------
Hi [~fpj]. Thanks for looking at it.
bq. One of the problems pointed out here is that getPendingChanges is adding a
record for a path that doesn't exist and I was wondering why a nonode exception
is not being thrown for such a znode, which would skip the addition of the -1
record to the hashmap.
I didn't get your question..
So the case described is:
* ClientA.create( "/a", ... PERSISTENT) => succeed
* ClientB.create( "/a/b", ... EPHEMERAL) => succeed
* ClientA.multi([ delete("/a") ]) => fail, abort. This left a
OutStandingRecord{ path="/a", zxid=-1, childCount=1} which didn't get removed.
* ClientB disconnect.
* ClientA.delete("/a") => fail. Because it gets the left
[OutStandingRecord|https://github.com/fengjingchao/zookeeper/blob/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java#L482]
and thinks [childCount >
0|https://github.com/fengjingchao/zookeeper/blob/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java#L485]
> Unable to delete a node when the node has no children
> -----------------------------------------------------
>
> Key: ZOOKEEPER-2052
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2052
> Project: ZooKeeper
> Issue Type: Bug
> Components: server
> Affects Versions: 3.4.6, 3.5.0
> Environment: Red Hat Enterprise Linux 6.1 x86_64, standalone or 3
> node ensemble (v3.4.6), 2 Java clients (v3.4.6)
> Reporter: Yip Ng
> Assignee: Hongchao Deng
> Attachments: ZOOKEEPER-2052-v2.patch,
> ZOOKEEPER-2052-v3-release.patch, ZOOKEEPER-2052-v3.patch,
> ZOOKEEPER-2052-v4.patch, ZOOKEEPER-2052.patch, ZOOKEEPER-2052.patch,
> ZOOKEEPER-2052.patch, test-jenkins.patch, zookeeper.log
>
>
> We stumbled upon a ZooKeeper bug where a node with no children cannot be
> removed on our 3 node ZooKeeper ensemble or standalone ZooKeeper on Red Hat
> Enterprise Linux x86_64 environment. Here is an example scenario/setup:
> o Standalone ZooKeeper or 3 node ensemble (v3.4.6)
> o 2 Java clients (v3.4.6)
> - Client A creates a persistent node (e.g.: /metadata/resources)
> - Client B creates ephemeral nodes under this persistent node
> o Client A attempts to remove the /metadata/resources node via multi op
> delete but fails since there are children
> o Client B's session expired, all the ephemeral nodes are removed
> o Client A attempts to recursively remove /metadata/resources node via
> multi op, this is expected to succeed but got the following exception:
> org.apache.zookeeper.KeeperException$NotEmptyException:
> KeeperErrorCode = Directory not empty
> (Note that Client B is the only client that creates these ephemeral nodes)
> o After this, we use zkCli.sh to inspect the problematic node but the
> zkCli.sh shows the /metadata/resources node indeed have no children but it
> will not allow /metadata/resources node to get deleted. (shown below)
> [zk: localhost:2181(CONNECTED) 0] ls /
> [zookeeper, metadata]
> [zk: localhost:2181(CONNECTED) 1] ls /metadata
> [resources]
> [zk: localhost:2181(CONNECTED) 2] get /metadata/resources
> null
> cZxid = 0x3
> ctime = Wed Oct 01 22:04:11 PDT 2014
> mZxid = 0x3
> mtime = Wed Oct 01 22:04:11 PDT 2014
> pZxid = 0x9
> cversion = 2
> dataVersion = 0
> aclVersion = 0
> ephemeralOwner = 0x0
> dataLength = 0
> numChildren = 0
> [zk: localhost:2181(CONNECTED) 3] delete /metadata/resources
> Node not empty: /metadata/resources
> [zk: localhost:2181(CONNECTED) 4] get /metadata/resources
> null
> cZxid = 0x3
> ctime = Wed Oct 01 22:04:11 PDT 2014
> mZxid = 0x3
> mtime = Wed Oct 01 22:04:11 PDT 2014
> pZxid = 0x9
> cversion = 2
> dataVersion = 0
> aclVersion = 0
> ephemeralOwner = 0x0
> dataLength = 0
> numChildren = 0
> o The only ways to remove this node is to either:
> a) Restart the ZooKeeper server
> b) set data to /metadata/resources then followed by a subsequent delete.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)