You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zookeeper.apache.org by "Nicholas Knight (JIRA)" <ji...@apache.org> on 2010/11/09 03:24:08 UTC
[jira] Updated: (ZOOKEEPER-921) zkPython incorrectly checks for
existence of required ACL elements
[ https://issues.apache.org/jira/browse/ZOOKEEPER-921?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Nicholas Knight updated ZOOKEEPER-921:
--------------------------------------
Summary: zkPython incorrectly checks for existence of required ACL elements (was: zkPython interferes with/corrupts Python's 'logging' module)
I've found the actual problem.
The direct cause was that I forgot to include the 'perms' element in the ACL. My bad.
Contributing to the difficulty in figuring out what the heck was going on was the fact that {{check_is_acl()}} in {{src/contrib/zkpython/src/zookeeper.c}} incorrectly checks for the existence of the required elements:
{code:title=zookeeper.c}
entry = PyDict_GetItemString( element, "perms" );
if (entry == Py_None) {
return 0;
}
{code}
Per the Python C API docs (http://docs.python.org/c-api/dict.html#PyDict_GetItemString), {{PyDict_GetItemString}} returns {{NULL}}, not {{Py_None}}, if the item doesn't exist.
There are probably some other checks that should really be done in check_is_acl(), but just changing {{Py_None}} to {{NULL}} in each {{if (entry == ...}} check resulted in the correct behavior -- a useful exception: {{Caught exception: InvalidACLException('invalid acl',)}}
> zkPython incorrectly checks for existence of required ACL elements
> ------------------------------------------------------------------
>
> Key: ZOOKEEPER-921
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-921
> Project: Zookeeper
> Issue Type: Bug
> Components: contrib-bindings
> Affects Versions: 3.3.1, 3.4.0
> Environment: Mac OS X 10.6.4, included Python 2.6.1
> Reporter: Nicholas Knight
> Assignee: Nicholas Knight
> Fix For: 3.3.3, 3.4.0
>
> Attachments: zktest.py
>
>
> Calling {{zookeeper.create()}} seems, under certain circumstances, to be corrupting a subsequent call to Python's {{logging}} module.
> Specifically, if the node does not exist (but its parent does), I end up with a traceback like this when I try to make the logging call:
> {noformat}
> Traceback (most recent call last):
> File "zktest.py", line 21, in <module>
> logger.error("Boom?")
> File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/logging/__init__.py", line 1046, in error
> if self.isEnabledFor(ERROR):
> File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/logging/__init__.py", line 1206, in isEnabledFor
> return level >= self.getEffectiveLevel()
> File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/logging/__init__.py", line 1194, in getEffectiveLevel
> while logger:
> TypeError: an integer is required
> {noformat}
> But if the node already exists, or the parent does not exist, I get the appropriate NodeExists or NoNode exceptions.
> I'll be attaching a test script that can be used to reproduce this behavior.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.