You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zookeeper.apache.org by "Laxman (JIRA)" <ji...@apache.org> on 2011/07/22 10:35:58 UTC
[jira] [Commented] (ZOOKEEPER-1128) Recipe wrong for Lock process.
[ https://issues.apache.org/jira/browse/ZOOKEEPER-1128?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13069444#comment-13069444 ]
Laxman commented on ZOOKEEPER-1128:
-----------------------------------
While implementing the lock recipe, I interpreted "the next lowest sequence number" correctly. I feel this phrase is not ambiguous and don't need to correct it.
Any suggestions?
> Recipe wrong for Lock process.
> ------------------------------
>
> Key: ZOOKEEPER-1128
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1128
> Project: ZooKeeper
> Issue Type: Bug
> Components: recipes
> Affects Versions: 3.3.3
> Reporter: yynil
>
> http://zookeeper.apache.org/doc/trunk/recipes.html
> The current recipe for Lock has the wrong process.
> Specifically, for the
> "4. The client calls exists( ) with the watch flag set on the path in the lock directory with the next lowest sequence number."
> It shouldn't be the "the next lowest sequence number". It should be the "current lowest path".
> If you're gonna use "the next lowest sequence number", you'll never wait for the lock possession.
> The following is the test code:
> {code:title=LockTest.java|borderStyle=solid}
> ACL acl = new ACL(Perms.ALL, new Id("10.0.0.0/8", "1"));
> List<ACL> acls = new ArrayList<ACL>();
> acls.add(acl);
> String connectStr = "localhost:2181";
> final Semaphore sem = new Semaphore(0);
> ZooKeeper zooKeeper = new ZooKeeper(connectStr, 1000 * 30, new Watcher() {
> @Override
> public void process(WatchedEvent event) {
> System.out.println("eventType:" + event.getType());
> System.out.println("keeperState:" + event.getState());
> if (event.getType() == Event.EventType.None) {
> if (event.getState() == Event.KeeperState.SyncConnected) {
> sem.release();
> }
> }
> }
> });
> System.out.println("state:" + zooKeeper.getState());
> System.out.println("Waiting for the state to be connected");
> try {
> sem.acquire();
> } catch (InterruptedException ex) {
> ex.printStackTrace();
> }
> System.out.println("Now state:" + zooKeeper.getState());
> String directory = "/_locknode_";
> Stat stat = zooKeeper.exists(directory, false);
> if (stat == null) {
> zooKeeper.create(directory, new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
> }
> String prefix = directory + "/lock-";
> String path = zooKeeper.create(prefix, new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
> System.out.println("Create the path for " + path);
> while (true) {
> List<String> children = zooKeeper.getChildren(directory, false);
> Collections.sort(children);
> System.out.println("The whole lock size is " + children.size());
> String lowestPath = children.get(0);
> DecimalFormat df = new DecimalFormat("0000000000");
> String currentSuffix = lowestPath.substring("lock-".length());
> System.out.println("CurrentSuffix is " + currentSuffix);
> int intIndex = Integer.parseInt(currentSuffix);
> if (path.equals(directory + "/" + lowestPath)) {
> //I've got the lock and release it
> System.out.println("I've got the lock at " + new Date());
> System.out.println("next index is " + intIndex);
> Thread.sleep(10000);
> System.out.println("After sleep 3 seconds, I'm gonna release the lock");
> zooKeeper.delete(path, -1);
> break;
> }
> final Semaphore wakeupSem = new Semaphore(0);
> stat = zooKeeper.exists(directory + "/" + lowestPath, new Watcher() {
> @Override
> public void process(WatchedEvent event) {
> System.out.println("Event is " + event.getType());
> System.out.println("State is " + event.getState());
> if (event.getType() == Event.EventType.NodeDeleted) {
> wakeupSem.release();
> }
> }
> });
> if (stat != null) {
> System.out.println("Waiting for the delete of ");
> wakeupSem.acquire();
> } else {
> System.out.println("Continue to seek");
> }
> }
> {code}
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira