Github user hanm commented on a diff in the pull request: https://github.com/apache/zookeeper/pull/96#discussion_r87543684 --- Diff: src/java/test/org/apache/zookeeper/server/DataTreeTest.java --- @@ -200,29 +198,34 @@ public void testSerializeDoesntLockDataNodeWhileWriting() throws Exception { BinaryOutputArchive oa = new BinaryOutputArchive(out) { @Override public void writeRecord(Record r, String tag) throws IOException { - DataNode node = (DataNode) r; - if (node.data.length == 1 && node.data[0] == 42) { - final Semaphore semaphore = new Semaphore(0); - new Thread(new Runnable() { - @Override - public void run() { - synchronized (markerNode) { - //When we lock markerNode, allow writeRecord to continue - semaphore.release(); + // Need check if the record is a DataNode instance because of changes in ZOOKEEPER-2014 + // which adds default ACL to config node. + if (r instanceof DataNode) { --- End diff -- @fpj - we were not setting ACLs on intrinsic znodes (i.e. /zookeeper/config) ZooKeeper implicitly created while initializing a DataTree before. And for this test case, it only creates znodes, not ACLs. As a result, it's reasonable for the previous test case to assume every record that's serializing is a DataNode record. Now with this patch, there is an ACL implicitly created when /zookeeper/config node is created, so the previous assumption (that all records to be serialized are DataNode record) does not hold. Thus, a change is required. For reference, you could put a break point on https://github.com/apache/zookeeper/blob/master/src/java/main/org/apache/zookeeper/server/ReferenceCountedACLCache.java#L133 while running this test case, and you will see there is one ACL that's serialized. Now you can remove the ACL associated with /zookeeper/config at https://github.com/apache/zookeeper/pull/96/files#diff-a676d93082759105dd8c79c0a76a8007R259, and you will see the break point on ReferenceCountedACLCache.java previous set not get hit. That is the difference. Another way to experiment this is to create an ACL in this test (without applying this pull request first), something like: `final DataNode markerNode = tree.getNode("/marker"); tree.setACL("/marker", ZooDefs.Ids.READ_ACL_UNSAFE, -1);` will do. Then we will see the same type casting failure - this simulates what this PR will do in terms of changing the type of records. Basically I think the root cause is the test itself could be made more robust, by eliminate the assumptions (that every record is a DataNode) that might not always hold.
--- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. ---