From: Flavio J. <fpj...@ya...> - 2008-07-11 08:02:10
|
Hi Avinash, getChildren returns a list in lexicographic order, so if you are updating the children of the election node concurrently, then you may get a different first node with different clients. If you are using the sequence flag to create nodes, then you may consider stripping the prefix of the node name and using the sufix value to determine order. Hope it helps. -Flavio ----- Original Message ---- From: Avinash Lakshman <avi...@gm...> To: zoo...@li... Sent: Friday, July 11, 2008 7:20:06 AM Subject: [Zookeeper-user] Leader election Hi I am trying to elect leader among 50 nodes. There is always one odd guy who seems to think that someone else distinct from what some other nodes see as leader. Could someone please tell me what is wrong with the following code for leader election: public void electLeader() { ZooKeeper zk = StorageService.instance().getZooKeeperHandle(); String path = "/Leader"; try { String createPath = path + "/L-"; LeaderElector.createLock_.lock(); while( true ) { /* Get all znodes under the Leader znode */ List<String> values = zk.getChildren(path, false); /* * Get the first znode and if it is the * pathCreated created above then the data * in that znode is the leader's identity. */ if ( leader_ == null ) { leader_ = new AtomicReference<EndPoint>( EndPoint.fromBytes( zk.getData(path + "/" + values.get(0), false, null) ) ); } else { leader_.set( EndPoint.fromBytes( zk.getData(path + "/" + values .get(0), false, null) ) ); /* Disseminate the state as to who the leader is. */ onLeaderElection(); } logger_.debug("Elected leader is " + leader_ + " @ znode " + ( path + "/" + values.get(0) ) ); Collections.sort(values); /* We need only the last portion of this znode */ String[] peices = pathCreated_.split("/"); int index = Collections.binarySearch(values, peices[peices.length - 1]); if ( index > 0 ) { String pathToCheck = path + "/" + values.get(index - 1); Stat stat = zk.exists(pathToCheck, true); if ( stat != null ) { logger_.debug("Awaiting my turn ..."); condition_.await(); logger_.debug("Checking to see if leader is around ..."); } } else { break; } } } catch ( InterruptedException ex ) { logger_.warn(LogUtil.throwableToString(ex)); } catch ( KeeperException ex ) { logger_.warn(LogUtil.throwableToString(ex)); } finally { LeaderElector.createLock_.unlock(); } } } Thanks Avinash |