1、收集第一輪投票結(jié)果
2、統(tǒng)計(jì)投票數(shù),計(jì)算出投票數(shù)最大的id
3、如果投票數(shù)超過(guò)1/2則選該id為leader
4、如果最大投票數(shù)id沒(méi)有超過(guò)1/2,則推薦txid最大的id為leader
5、計(jì)算出最大的txid及其服務(wù)器id
6、計(jì)算出最大的txid有幾個(gè)
7、如果最大txid超過(guò)一個(gè),則比較服務(wù)器id,推薦服務(wù)id最大的為leader
8、發(fā)起第二輪投票
Java實(shí)現(xiàn)代碼如下:

/** *//**
* 選舉leader
* @param vote 投票信息
* @return
*/
public int forLeader(Map<Integer,Notification> vote)

{
//統(tǒng)計(jì)leader投票數(shù)
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);
}
//計(jì)算出投票數(shù)最大的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();
}
}
//如果投票數(shù)超過(guò)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;
}
//如果最大投票數(shù)leader沒(méi)有超過(guò)1/2,則推薦txid最大的id為leader
//計(jì)算出最大的txid及其服務(wù)器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;
}
}
//計(jì)算出最大的txid有幾個(gè)
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());
}
}
//如果超過(guò)一個(gè),則比較服務(wù)器id,推薦服務(wù)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 閱讀(1880)
評(píng)論(0) 編輯 收藏 所屬分類:
分布式