1、提出者向leader发出询问消息
2、leader向所有的QuorumPeer发出投票请求
3、QuorumPeer对该请求进行投票,如果消息的txid大于QuorumPeer的txid则通过该投票,否则反对该投票
4、leader根据所有的QuorumPeer投票结果进行计算,如果有一半以上的QuorumPeer通过则接受提出者的请求,否则拒绝提出者的请求
switch (message.getType())
{
case QuorumCode.ask://询问类型
//询问该事务是否可操作
Ask task=new Ask(message,sc);
My.executor.execute(task);
m.setCode(JuiceCode.OK);
break;
case QuorumCode.vote://投票类型
if(My.txid>=message.getTxid())
//拒绝
m.setCode(JuiceCode.ERROR);
else
{
//通过
m.setCode(JuiceCode.OK);
My.updateMyTxid(message.getTxid());
}
break;
case QuorumCode.ping://ping
m.setCode(JuiceCode.OK);
m.setMyid(message.getMyid());
break;
}
public static boolean sendAndVote(Message m) throws IOException
{
m.setType(QuorumCode.vote);
Map<Integer,Response> mp=new TreeMap<Integer,Response>();
for(Map.Entry<Integer,NIOClient> entry:voteClientMap.entrySet())
{
NIOClient client=entry.getValue();
Response response=client.send(ByteUtil.getBytes(m));
mp.put(entry.getKey(), response);
}
Map<Integer,Message> vote=new TreeMap<Integer,Message>();
for(Map.Entry<Integer,Response> entry:mp.entrySet())
vote.put(entry.getKey(), (Message)ByteUtil.getObject(entry.getValue().getData()));
int ok=0;
for(Map.Entry<Integer,Message> entry:vote.entrySet())
{
Message f=entry.getValue();
if(f.getCode()==JuiceCode.OK)
ok++;
}
if(ok/(vote.size()*1.0)>1/2.0)
return true;
return false;
}
posted on 2013-04-23 13:19
nianzai 阅读(1746)
评论(0) 编辑 收藏 所属分类:
分布式