随笔-23  评论-58  文章-0  trackbacks-0

1、收集第一轮投票结果
2、统计投票数,计算出投票数最大的id
3、如果投票数超过1/2则选该id为leader
4、如果最大投票数id没有超过1/2,则推荐txid最大的id为leader
5、计算出最大的txid及其服务器id
6、计算出最大的txid有几个
7、如果最大txid超过一个,则比较服务器id,推荐服务id最大的为leader
8、发起第二轮投票

Java实现代码如下:
        /**
         * 选举leader
         * 
@param vote 投票信息
         * 
@return
         
*/

        
public int forLeader(Map<Integer,Notification> vote)
        
{
            
//统计leader投票数
            TreeMap<Integer,Integer> tmap=new TreeMap<Integer,Integer>();
            
for(Map.Entry<Integer,Notification> entry:vote.entrySet())
            
{
                Notification nf
=entry.getValue();
                
if(tmap.containsKey(nf.leader))
                    tmap.put(nf.leader, tmap.get(nf.leader)
+1);
                
else
                    tmap.put(nf.leader, 
1);
            }

            
//计算出投票数最大的id
            int a=0;
            
int l=0;
            
for(Map.Entry<Integer,Integer> entry:tmap.entrySet())
            
{
                
if(entry.getValue()>a)
                
{
                    a
=entry.getValue();
                    l
=entry.getKey();
                }

            }

            
//如果投票数超过1/2则选该id为leader
            if(a/(My.serverList.size()*1.0)>1/2.0)
            
{
                
//选出leader
                if(l==My.myid)
                    My.myServerState
=ServerState.LEADING;
                
else
                    My.myServerState
=ServerState.FLLOWING;
                My.leader
=l;
                
                
return -1;
            }

            
//如果最大投票数leader没有超过1/2,则推荐txid最大的id为leader
            
//计算出最大的txid及其服务器id
            long txid=0;
            
int leader=0;
            
for(Map.Entry<Integer,Notification> entry:vote.entrySet())
            
{
                
if(entry.getValue().txid>txid)
                
{
                    leader
=entry.getKey();
                    txid
=entry.getValue().txid;
                }

            }

            
//计算出最大的txid有几个
            Map<Integer,Notification> vte=new TreeMap<Integer,Notification>();
            
for(Map.Entry<Integer,Notification> entry:vote.entrySet())
            
{
                
if(entry.getValue().txid==txid)
                
{
                    vte.put(entry.getValue().id, entry.getValue());
                }

            }

            
//如果超过一个,则比较服务器id,推荐服务id最大的为leader
            if(vte.size()>1)
            
{
                
for(Map.Entry<Integer,Notification> entry:vte.entrySet())
                
{
                    
if(entry.getValue().id>leader)
                        leader
=entry.getKey();
                }

            }

            
return leader;
        }

    }

posted on 2013-04-17 11:15 nianzai 阅读(1867) 评论(0)  编辑  收藏 所属分类: 分布式

只有注册用户登录后才能发表评论。


网站导航: