hadoop-zookeeper-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Flavio Junqueira <fpjunque...@yahoo.com>
Subject Re: [Zookeeper-user] Leader election
Date Fri, 11 Jul 2008 08:02:12 GMT
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 <avinash.lakshman@gmail.com>
To: zookeeper-user@lists.sourceforge.net
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



      
Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message