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);
}