Patrick, In v3/4, I am using Ids.CREATOR_ALL_ACL. In v5 Ids.OPEN_ACL_UNSAFE. In all cases, ACLs are specified and authentication credentials have been added to zookeeper instance.
---------------------------------- CODE ----------------------------------- // v5 // for ( ACL ids_acl : Ids.CREATOR_ALL_ACL ) // { // acl.add( ids_acl ); // } // v3/4 for ( ACL ids_acl : Ids.OPEN_ACL_UNSAFE ) { acl.add( ids_acl ); } // all cases (v3,4,5) have authentication credentials set zoo = new ZooKeeper( connection_string, connectiontimeout, this ); zoo.addAuthInfo( authentication_type, authentication.getBytes() ); // all cases (v3,4,5) use the acl defined above zoo.create( normPath(path), new byte[0], acl, mode ); I'll investigate further and log a bug if I can isolate this. -Todd > -----Original Message----- > From: Patrick Hunt [mailto:ph...@apache.org] > Sent: Monday, September 21, 2009 4:32 PM > To: zookeeper-user@hadoop.apache.org; Todd Greenwood > Cc: Patrick Hunt > Subject: Re: ACL question w/ Zookeeper 3.1.1 > > Todd Greenwood wrote: > > Patrick, > > > > Thanks, I'll spend some more time trying to create a more concise repro, > > and log a bug once I do. The only reason I posted this mash was to see > > if the replyHeader error, "0,0,-112", made sense of the ACL exception. > > > > The rest is just context...and clearly too much of that :o). I don't see > > a difference between v3 and v4...The only differences that I can see are > > the between v4 and v5 (v4 fails and v5 succeeds): > > I did see this diff btw 3/4, 3 has this: > > request = > {org.apache.zookeeper.proto.createrequ...@1360}"'/ACLTest,,v{},0\n" > > you don't have any acl specified for the node create, or is this > supposed to be a working example w/o auth? (like I said, I'm confused...) > > > > > v4: > >>> response = {org.apache.zookeeper.proto.createrespo...@1365}"\n" > >>> r = {org.apache.zookeeper.proto.replyhea...@1445}"0,0,-112\n" > > > > -112 return code is "session expired", not auth failure. according to > this your client's session expired, but w/o more info (code/log or idea > of what your test is doing) I can't really speculate why you are getting > this (old client session that was not shutdown correctly and finally > expired while running a different/new test?) > > Patrick > > > v5: > >>> response = > > {org.apache.zookeeper.proto.createrespo...@1360}"'/ACLTest\n" > >>> r = {org.apache.zookeeper.proto.replyhea...@1389}"2,2,0\n" > > > > -Todd > > > >> -----Original Message----- > >> From: Patrick Hunt [mailto:ph...@apache.org] > >> Sent: Monday, September 21, 2009 4:14 PM > >> To: zookeeper-user@hadoop.apache.org; Todd Greenwood > >> Subject: Re: ACL question w/ Zookeeper 3.1.1 > >> > >> Todd, I spent some time looking at your output and honestly I'm having > >> trouble making sense of what you are saying. What's the diff btw v3 & > >> v4? I'm afraid here are too many variables, can you help nail things > > down? > >> 1) create a jira for this > >> https://issues.apache.org/jira/browse/ZOOKEEPER > >> > >> 2) if at all possible attach the code you are running that has > > problems, > >> seems like you've boiled it down to a case where it is deterministic, > >> this would be the best for us to debug. If you can't attach the code > >> then include snippets - in particular the addAuthInfo call > > (w/parameter > >> details) for your clients, and the individual create calls, including > >> the acl specifics - and describe what your client(s) are doing in > > detail > >> so that we can attempt to reproduce. > >> > >> 3) attach a trace level log from both the server and client during > > your > >> test run, point out the time index when you see the auth failure. > >> > >> > >> btw, you might try doing a getACL(path...) just before the operation > >> that's failing - it will give you some insight into what the acl is > > set > >> to for that node. > >> > >> Patrick > >> > >> Todd Greenwood wrote: > >>> Patrick / Mahadev, > >>> > >>> I've spent the last couple of days attempting to isolate this issue, > > and > >>> this is what I've come up with... > >>> > >>> Mahadev's simple use case works fine, as posted. However, my more > >>> involved use cases are consistently failing w/ InvalidACL exceptions > >>> when I use digest authentication with Ids.CREATOR_ALL_ACL: > >>> > >>> java.lang.Exception: > >>> com.audiencescience.util.zookeeper.wrapper.ZooWrapperException: > >>> org.apache.zookeeper.KeeperException$InvalidACLException: > >>> KeeperErrorCode = InvalidACL for /ACLTest > >>> > >>> Prior to throwing this exception, the response is > >>> (Zookeeper.java:create()): > >>> r = {org.apache.zookeeper.proto.replyhea...@1445}"0,0,-112\n > >>> <mailto:{org.apache.zookeeper.proto.replyhea...@1445}> ". More debug > >>> data below. > >>> > >>> So, while I can get Mahadev's simple example to work, I cannot get a > >>> more involved use case to work correctly. However, if I change my > > code > >>> to use Ids.OPEN_ACL_UNSAFE, then everything works fine. Example > > debug > >>> output below at "v5". > >>> > >>> Could someone point me at non-trivial test cases for ACLs, and > > perhaps > >>> give me some insight into how to debug this issue further? > >>> > >>> -Todd > >>> > >>> > >>> ------------------------------- > >>> Code Snippet ZooKeeper.java > >>> ------------------------------- > >>> > >>> public String create(String path, byte data[], List<ACL> acl, > >>> CreateMode createMode) > >>> throws KeeperException, InterruptedException > >>> { > >>> validatePath(path); > >>> > >>> RequestHeader h = new RequestHeader(); > >>> h.setType(ZooDefs.OpCode.create); > >>> CreateRequest request = new CreateRequest(); > >>> CreateResponse response = new CreateResponse(); > >>> request.setData(data); > >>> request.setFlags(createMode.toFlag()); > >>> request.setPath(path); > >>> if (acl != null && acl.size() == 0) { > >>> throw new KeeperException.InvalidACLException(); > >>> } > >>> request.setAcl(acl); > >>> ReplyHeader r = cnxn.submitRequest(h, request, response, > > null); > >>>>>> v3 > >>>>>> v5 > >>> if (r.getErr() != 0) { > >>> > >>>>>> v4 > >>> throw > >>> KeeperException.create(KeeperException.Code.get(r.getErr()), > >>> path); > >>> } > >>> return response.getPath(); > >>> } > >>> > >>> > >>> --------------------------------------------- > >>> v3 > >>> --------------------------------------------- > >>> this = {org.apache.zookeeper.zookee...@1267} > >>> watchManager = {org.apache.zookeeper.zookeeper$zkwatchmana...@1379} > >>> state = {org.apache.zookeeper.zookeeper$sta...@1380}"CONNECTED" > >>> cnxn = {org.apache.zookeeper.clientc...@1381}"sessionId: > >>> 0x123de5b3b1b0000\nlastZxid: 1\nxid: 2\nnextAddrToTry: > > 0\nserverAddrs: > >>> /127.0.0.1:2181\n" > >>> serverAddrs = {java.util.arrayl...@1386} size = 1 > >>> authInfo = {java.util.arrayl...@1387} size = 1 > >>> [0] = {org.apache.zookeeper.clientcnxn$authd...@1398} > >>> scheme = {java.lang.str...@1244}"digest" > >>> data = {byte[...@1399} > >>> pendingQueue = {java.util.linkedl...@1388} size = 0 > >>> outgoingQueue = {java.util.linkedl...@1389} size = 1 > >>> nextAddrToTry = 0 > >>> connectTimeout = 40000 > >>> readTimeout = 26666 > >>> sessionTimeout = 50000 > >>> zooKeeper = {org.apache.zookeeper.zookee...@1267} > >>> watcher = {org.apache.zookeeper.zookeeper$zkwatchmana...@1379} > >>> sessionId = 82153701637816320 > >>> sessionPasswd = {byte[...@1390} > >>> sendThread = > >>> > > {org.apache.zookeeper.clientcnxn$sendthr...@1259}"Thread[main-SendThread > >>> ,5,main]" > >>> eventThread = > >>> > > {org.apache.zookeeper.clientcnxn$eventthr...@1266}"Thread[main-EventThre > >>> ad,5,main]" > >>> selector = {sun.nio.ch.epollselectori...@1391} > >>> closing = false > >>> eventOfDeath = {java.lang.obj...@1392} > >>> lastZxid = 1 > >>> xid = 2 > >>> acl = {java.util.arrayl...@1242} size = 1 > >>> [0] = {org.apache.zookeeper.data....@1348}"31,s{'auth,'}\n" > >>> perms = 31 > >>> id = {org.apache.zookeeper.data...@1404}"'auth,'\n" > >>> request = > >>> {org.apache.zookeeper.proto.createrequ...@1360}"'/ACLTest,,v{},0\n" > >>> path = {java.lang.str...@1314}"/ACLTest" > >>> data = {byte...@1339} > >>> acl = null > >>> flags = 0 > >>> path = {java.lang.str...@1314}"/ACLTest" > >>> > >>> > >>> --------------------------------------------- > >>> v4 > >>> --------------------------------------------- > >>> this = {org.apache.zookeeper.zookee...@1267} > >>> watchManager = {org.apache.zookeeper.zookeeper$zkwatchmana...@1379} > >>> state = {org.apache.zookeeper.zookeeper$sta...@1453}"CLOSED" > >>> cnxn = {org.apache.zookeeper.clientc...@1381}"sessionId: > >>> 0x123de5b3b1b0000\nlastZxid: 1\nxid: 3\nnextAddrToTry: > > 0\nserverAddrs: > >>> /127.0.0.1:2181\n" > >>> serverAddrs = {java.util.arrayl...@1386} size = 1 > >>> authInfo = {java.util.arrayl...@1387} size = 1 > >>> [0] = {org.apache.zookeeper.clientcnxn$authd...@1398} > >>> scheme = {java.lang.str...@1244}"digest" > >>> data = {byte[...@1399} > >>> pendingQueue = {java.util.linkedl...@1388} size = 0 > >>> outgoingQueue = {java.util.linkedl...@1389} size = 0 > >>> nextAddrToTry = 0 > >>> connectTimeout = 40000 > >>> readTimeout = 26666 > >>> sessionTimeout = 50000 > >>> zooKeeper = {org.apache.zookeeper.zookee...@1267} > >>> watcher = {org.apache.zookeeper.zookeeper$zkwatchmana...@1379} > >>> sessionId = 82153701637816320 > >>> sessionPasswd = {byte[...@1390} > >>> sendThread = > >>> > > {org.apache.zookeeper.clientcnxn$sendthr...@1259}"Thread[main-SendThread > >>> ,5,]" > >>> eventThread = > >>> > > {org.apache.zookeeper.clientcnxn$eventthr...@1266}"Thread[main-EventThre > >>> ad,5,main]" > >>> selector = {sun.nio.ch.epollselectori...@1391} > >>> closing = false > >>> eventOfDeath = {java.lang.obj...@1392} > >>> lastZxid = 1 > >>> xid = 3 > >>> response = {org.apache.zookeeper.proto.createrespo...@1365}"\n" > >>> r = {org.apache.zookeeper.proto.replyhea...@1445}"0,0,-112\n" > >>> request = > >>> > > {org.apache.zookeeper.proto.createrequ...@1360}"'/ACLTest,,v{s{31,s{'aut > >>> h,'}}},0\n" > >>> path = {java.lang.str...@1314}"/ACLTest" > >>> data = {byte...@1339} > >>> acl = {java.util.arrayl...@1242} size = 1 > >>> flags = 0 > >>> path = {java.lang.str...@1314}"/ACLTest" > >>> h = {org.apache.zookeeper.proto.requesthea...@1352}"2,1\n" > >>> cnxn = {org.apache.zookeeper.clientc...@1381}"sessionId: > >>> 0x123de5b3b1b0000\nlastZxid: 1\nxid: 3\nnextAddrToTry: > > 0\nserverAddrs: > >>> /127.0.0.1:2181\n" > >>> > >>> > >>> -------------------------------------- > >>> v5 > >>> > >>> NOTE: If I use Ids.OPEN_ACL_UNSAFE, then everything works fine. > > Here's > >>> an example of the debug state after a create()... > >>> -------------------------------------- > >>> > >>> this = {org.apache.zookeeper.zookee...@1266} > >>> watchManager = {org.apache.zookeeper.zookeeper$zkwatchmana...@1397} > >>> state = {org.apache.zookeeper.zookeeper$sta...@1398}"CONNECTED" > >>> cnxn = {org.apache.zookeeper.clientc...@1374}"sessionId: > >>> 0x123de6ba8de0000\nlastZxid: 2\nxid: 3\nnextAddrToTry: > > 0\nserverAddrs: > >>> /127.0.0.1:2181\n" > >>> serverAddrs = {java.util.arrayl...@1403} size = 1 > >>> authInfo = {java.util.arrayl...@1404} size = 1 > >>> [0] = {org.apache.zookeeper.clientcnxn$authd...@1415} > >>> scheme = {java.lang.str...@1244}"digest" > >>> data = {byte[...@1416} > >>> pendingQueue = {java.util.linkedl...@1405} size = 0 > >>> outgoingQueue = {java.util.linkedl...@1406} size = 0 > >>> nextAddrToTry = 0 > >>> connectTimeout = 40000 > >>> readTimeout = 26666 > >>> sessionTimeout = 50000 > >>> zooKeeper = {org.apache.zookeeper.zookee...@1266} > >>> watcher = {org.apache.zookeeper.zookeeper$zkwatchmana...@1397} > >>> sessionId = 82153772198789120 > >>> sessionPasswd = {byte[...@1407} > >>> sendThread = > >>> > > {org.apache.zookeeper.clientcnxn$sendthr...@1259}"Thread[main-SendThread > >>> ,5,main]" > >>> eventThread = > >>> > > {org.apache.zookeeper.clientcnxn$eventthr...@1265}"Thread[main-EventThre > >>> ad,5,main]" > >>> selector = {sun.nio.ch.epollselectori...@1408} > >>> closing = false > >>> eventOfDeath = {java.lang.obj...@1409} > >>> lastZxid = 2 > >>> xid = 3 > >>> response = > > {org.apache.zookeeper.proto.createrespo...@1360}"'/ACLTest\n" > >>> r = {org.apache.zookeeper.proto.replyhea...@1389}"2,2,0\n" > >>> xid = 2 > >>> zxid = 2 > >>> err = 0 > >>> request = > >>> > > {org.apache.zookeeper.proto.createrequ...@1355}"'/ACLTest,,v{s{15,s{'wor > >>> ld,'anyone}}},0\n" > >>> path = {java.lang.str...@1314}"/ACLTest" > >>> h = {org.apache.zookeeper.proto.requesthea...@1347}"2,1\n" > >>> cnxn = {org.apache.zookeeper.clientc...@1374}"sessionId: > >>> 0x123de6ba8de0000\nlastZxid: 2\nxid: 3\nnextAddrToTry: > > 0\nserverAddrs: > >>> /127.0.0.1:2181\n" > >>> > >>>> -----Original Message----- > >>>> From: Todd Greenwood [mailto:to...@audiencescience.com] > >>>> Sent: Friday, September 18, 2009 11:27 AM > >>>> To: Patrick Hunt; zookeeper-...@hadoop.apache.org; zookeeper- > >>>> u...@hadoop.apache.org > >>>> Subject: RE: ACL question w/ Zookeeper 3.1.1 > >>>> > >>>> Patrick / Mahadev, > >>>> > >>>> Thanks for the heads-up! > >>>> > >>>> Apparently I *am* receiving email from zookeeper-user but it is > > being > >>>> filtered out as spam. This just started happening, but I'll rectify > > on > >>>> my end. > >>>> > >>>> I'm working thru Mahadev's response and will respond shortly (and > >>> search > >>>> for other postings, as well). Appologies for the cross post. > >>>> > >>>> -Todd > >>>> > >>>>> -----Original Message----- > >>>>> From: Patrick Hunt [mailto:ph...@apache.org] > >>>>> Sent: Friday, September 18, 2009 11:19 AM > >>>>> To: zookeeper-...@hadoop.apache.org; > >>> zookeeper-user@hadoop.apache.org > >>>>> Cc: Todd Greenwood > >>>>> Subject: Re: ACL question w/ Zookeeper 3.1.1 > >>>>> > >>>>> Todd, there were other responses as well. Are you seeing other > >>> traffic > >>>>> from the lists? (perhaps a spam filtering issue?) > >>>>> > >>>>> Patrick > >>>>> > >>>>> Mahadev Konar wrote: > >>>>>> HI todd, > >>>>>> We did respond on zookeeper-user. Here is my response in case > >>> you > >>>>> didn't > >>>>>> see it... > >>>>>> > >>>>>> > >>>>>> HI todd, > >>>>>> From what I understand, you are sayin that a creator_all_acl > > does > >>>> not > >>>>> work > >>>>>> with auth? > >>>>>> > >>>>>> I tried the following with CREATOR_ALL_ACL and it seemed to work > >>>> for > >>>>> me... > >>>>>> import org.apache.zookeeper.CreateMode; > >>>>>> import org.apache.zookeeper.WatchedEvent; > >>>>>> import org.apache.zookeeper.Watcher; > >>>>>> import org.apache.zookeeper.ZooKeeper; > >>>>>> import org.apache.zookeeper.data.ACL; > >>>>>> import org.apache.zookeeper.ZooDefs.Ids; > >>>>>> import java.util.ArrayList; > >>>>>> import java.util.List; > >>>>>> > >>>>>> public class TestACl implements Watcher { > >>>>>> > >>>>>> public static void main(String[] argv) throws Exception { > >>>>>> List<ACL> acls = new ArrayList<ACL>(1); > >>>>>> String authentication_type = "digest"; > >>>>>> String authentication = "mahadev:some"; > >>>>>> > >>>>>> for (ACL ids_acl : Ids.CREATOR_ALL_ACL) { > >>>>>> acls.add(ids_acl); > >>>>>> } > >>>>>> TestACl tacl = new TestACl(); > >>>>>> ZooKeeper zoo = new ZooKeeper("localhost:2181", 3000, > >>> tacl); > >>>>>> zoo.addAuthInfo(authentication_type, > >>>> authentication.getBytes()); > >>>>>> zoo.create("/some", new byte[0], acls, > >>>> CreateMode.PERSISTENT); > >>>>>> zoo.setData("/some", new byte[0], -1); > >>>>>> } > >>>>>> > >>>>>> @Override > >>>>>> public void process(WatchedEvent event) { > >>>>>> > >>>>>> > >>>>>> } > >>>>>> } > >>>>>> > >>>>>> > >>>>>> And it worked on my set of zookeeper servers.... > >>>>>> > >>>>>> And then > >>>>>> I tried > >>>>>> > >>>>>> Without auth > >>>>>> > >>>>>> Getdata("/some") > >>>>>> > >>>>>> Which correctly gave me the error: > >>>>>> > >>>>>> > >>>>>> Exception in thread "main" > >>>>>> org.apache.zookeeper.KeeperException$NoAuthException: > >>>> KeeperErrorCode = > >>>>>> NoAuth for /some > >>>>>> at > > org.apache.zookeeper.KeeperException.create(KeeperException.java:104) > >>>>>> at > > org.apache.zookeeper.KeeperException.create(KeeperException.java:42) > >>>>>> at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:892) > >>>>>> at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:921) > >>>>>> at > >>>>>> > > org.apache.zookeeper.ZooKeeperMain.processZKCmd(ZooKeeperMain.java:692) > >>>>>> at > > org.apache.zookeeper.ZooKeeperMain.processCmd(ZooKeeperMain.java:579) > >>>>>> at > >>>>>> > > org.apache.zookeeper.ZooKeeperMain.executeLine(ZooKeeperMain.java:351) > >>>>>> at > >>>> org.apache.zookeeper.ZooKeeperMain.run(ZooKeeperMain.java:309) > >>>>>> at > >>>> org.apache.zookeeper.ZooKeeperMain.main(ZooKeeperMain.java:268) > >>>>>> Is this what you are trying to do? > >>>>>> > >>>>>> Thanks > >>>>>> mahadev > >>>>>> > >>>>>> > >>>>>> On 9/18/09 10:33 AM, "Todd Greenwood" <to...@audiencescience.com> > >>>> wrote: > >>>>>>> Appologies for cross posting, but I haven't received a response > >>> on > >>>>> this. > >>>>>>> Quite simply, could someone point me to a working > >>>> example/tutorial/docs > >>>>>>> that describe how to use digest ACLs in zookeeper 3.1.1? The > > docs > >>>> that > >>>>> I > >>>>>>> have found (referenced below) have not clarified this for me. > >>>>>>> > >>>>>>> -Todd > >>>>>>> > >>>>>>>> -----Original Message----- > >>>>>>>> From: Todd Greenwood > >>>>>>>> Sent: Thursday, September 17, 2009 5:05 PM > >>>>>>>> To: 'zookeeper-user@hadoop.apache.org' > >>>>>>>> Subject: ACL question w/ Zookeeper 3.1.1 > >>>>>>>> > >>>>>>>> I'm attempting to secure a zookeeper installation using > >>> zookeeper > >>>>>>> ACLs. > >>>>>>>> However, I'm finding that while Ids.OPEN_ACL_UNSAFE works > > great, > >>>> my > >>>>>>>> attempts at using Ids.CREATOR_ALL_ACL are failing. Here's a > > code > >>>>>>> snippet: > >>>>>>>> public class ZooWrapper > >>>>>>>> { > >>>>>>>> > >>>>>>>> /* > >>>>>>>> 1. Here I'm setting up my authentication. I've got an ACL list, > >>>> and my > >>>>>>>> authentication strings. > >>>>>>>> */ > >>>>>>>> private final List<ACL> acl = new ArrayList<ACL>( 1 ); > >>>>>>>> private static final String authentication_type = "digest"; > >>>>>>>> private static final String authentication = > >>>>>>> "audiencescience:gravy"; > >>>>>>>> public ZooWrapper( final String connection_string, > >>>>>>>> final String path, > >>>>>>>> final int connectiontimeout ) throws > >>>>>>>> ZooWrapperException > >>>>>>>> { > >>>>>>>> ... > >>>>>>>> /* > >>>>>>>> 2. Here I'm adding the acls > >>>>>>>> */ > >>>>>>>> > >>>>>>>> // This works (creates nodes, sets data on nodes) > >>>>>>>> for ( ACL ids_acl : Ids.OPEN_ACL_UNSAFE ) > >>>>>>>> { > >>>>>>>> acl.add( ids_acl); > >>>>>>>> } > >>>>>>>> > >>>>>>>> /* > >>>>>>>> NOTE: This does not work (nodes are not created, cannot set > >>> data > >>>> on > >>>>>>> nodes > >>>>>>>> b/c nodes do not exist) > >>>>>>>> */ > >>>>>>>> > >>>>>>>> // for ( ACL ids_acl : Ids.CREATOR_ALL_ACL ) > >>>>>>>> // { > >>>>>>>> // acl.add( ids_acl ); > >>>>>>>> // } > >>>>>>>> > >>>>>>>> /* > >>>>>>>> 3. Finally, I create a new zookeeper instance and add my > >>>> authorization > >>>>>>>> info to it. > >>>>>>>> */ > >>>>>>>> zoo = new ZooKeeper( connection_string, connectiontimeout, > >>>> this > >>>>>>> ); > >>>>>>>> zoo.addAuthInfo( authentication_type, > >>>> authentication.getBytes() ) > >>>>>>>> /* > >>>>>>>> 4. Later, I try to write some data into zookeeper by first > >>>> creating > >>>>>>> the > >>>>>>>> node, and then calling setdata... > >>>>>>>> */ > >>>>>>>> zoo.create( path, new byte[0], acl, CreateMode.PERSISTENT > >>> ); > >>>>>>>> zoo.setData( path, bytes, -1 ) > >>>>>>>> > >>>>>>>> As I mentioned above, when I add Ids.OPEN_ACL_UNSAFE to acl, > >>> then > >>>> both > >>>>>>> the > >>>>>>>> create and setData succeed. However, when I use > >>>> Ids.CREATOR_ALL_ACL, > >>>>>>> then > >>>>>>>> the nodes are not created. Am I missing something obvious w/ > >>>> respect > >>>>>>> to > >>>>>>>> configuring ACLs? > >>>>>>>> > >>>>>>>> I've used the following references: > >>>>>>>> > >>>>>>>> > > http://hadoop.apache.org/zookeeper/docs/r3.1.1/zookeeperProgrammers.html > >>>>>>>> http://mail-archives.apache.org/mod_mbox/hadoop-zookeeper- > >>>>>>>> > > commits/200807.mbox/%3c20080731201025.c62092388...@eris.apache.org%3e > >>>>>>>> http://books.google.com/books?id=bKPEwR- > >>>>>>>> > > Pt6EC&pg=PT404&lpg=PT404&dq=zookeeper+ACL+digest+%22new+Id%22&source=bl& > >>>>>>> ot > >>>>>>> > > s=kObz0y8eFk&sig=VFCAsNW0mBJyZswoweJDI31iNlo&hl=en&ei=Z82ySojRFsqRlAeqxs > >>>>>>> yI > >>>>>>> > > Dw&sa=X&oi=book_result&ct=result&resnum=6#v=onepage&q=zookeeper%20ACL%20 > >>>>>>> di > >>>>>>>> gest%20%22new%20Id%22&f=false > >>>>>>>> > >>>>>>>> -Todd