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.
---

Reply via email to