Follower
主要工作:
- 处理客户端的非事务请求,将事务请求转发给Leader服务器
- 参与事务请求proposal的投票
- 参与Leader选举的投票
FollowerZooKeeperServer
类的继承关系
public class FollowerZooKeeperServer extends LearnerZooKeeperServer
类的属性
public class FollowerZooKeeperServer extends LearnerZooKeeperServer {
private static final Logger LOG =
LoggerFactory.getLogger(FollowerZooKeeperServer.class);
CommitProcessor commitProcessor;
SyncRequestProcessor syncProcessor;
/*
* 待同步请求
*/
ConcurrentLinkedQueue<Request> pendingSyncs;
/*
* 待处理的事务请求
*/
LinkedBlockingQueue<Request> pendingTxns = new LinkedBlockingQueue<Request>();
}
类的构造函数
FollowerZooKeeperServer(FileTxnSnapLog logFactory,QuorumPeer self,
DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException {
super(logFactory, self.tickTime, self.minSessionTimeout,
self.maxSessionTimeout, treeBuilder, zkDb, self);
this.pendingSyncs = new ConcurrentLinkedQueue<Request>();
}
核心函数分析
public void logRequest(TxnHeader hdr, Record txn) {
Request request = new Request(null, hdr.getClientId(), hdr.getCxid(),
hdr.getType(), null, null);
request.hdr = hdr;
request.txn = txn;
request.zxid = hdr.getZxid();
/*
* zxid不为0,表示本服务器已经处理过请求
*/
if ((request.zxid & 0xffffffffL) != 0) {
// 则需要将该请求放入pendingTxns中
pendingTxns.add(request);
}
// 使用SyncRequestProcessor处理请求
syncProcessor.processRequest(request);
}
public void commit(long zxid) {
// 没有还在等待处理的事务
if (pendingTxns.size() == 0) {
LOG.warn("Committing " + Long.toHexString(zxid)
+ " without seeing txn");
return;
}
// 队首元素的zxid
long firstElementZxid = pendingTxns.element().zxid;
// 如果队首元素的zxid不等于需要提交的zxid,则退出程序
if (firstElementZxid != zxid) {
LOG.error("Committing zxid 0x" + Long.toHexString(zxid)
+ " but next pending txn 0x"
+ Long.toHexString(firstElementZxid));
System.exit(12);
}
// 从待处理事务请求队列中删除队首请求
Request request = pendingTxns.remove();
// 提交该请求
commitProcessor.commit(request);
}
synchronized public void sync(){
// 没有需要同步的请求
if(pendingSyncs.size() ==0){
LOG.warn("Not expecting a sync.");
return;
}
// 从待同步队列中删除队首请求
Request r = pendingSyncs.remove();
// 提交该请求
commitProcessor.commit(r);
}