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) 编辑 收藏 所属分类:
分布式