- ZKDatabase 对象
- DataTree 节点树
- DataNode 数据节点
- 创建节点watch机制触发逻辑
- 删除节点触发watch机制逻辑
- 设置节点值触发watch机制逻辑
- 详细代码见zookeeper源码
` org.apache.zookeeper.server.FinalRequestProcessor#processRequest
org.apache.zookeeper.server.ZKDatabase#processTxn org.apache.zookeeper.server.DataTree#processTxn org.apache.zookeeper.server.WatchManager#triggerWatch(java.lang.String, org.apache.zookeeper.Watcher.Event.EventType) `
8.这里直接看下更新逻辑 a. FinalRequestProcessor#processRequest 部分核心逻辑
public void processRequest(Request request) {
if (LOG.isDebugEnabled()) {
LOG.debug("Processing request:: " + request);
}
// request.addRQRec(">final");
long traceMask = ZooTrace.CLIENT_REQUEST_TRACE_MASK;
if (request.type == OpCode.ping) {
traceMask = ZooTrace.SERVER_PING_TRACE_MASK;
}
if (LOG.isTraceEnabled()) {
ZooTrace.logRequest(LOG, traceMask, 'E', request, "");
}
ProcessTxnResult rc = null;
synchronized (zks.outstandingChanges) {
while (!zks.outstandingChanges.isEmpty()
&& zks.outstandingChanges.get(0).zxid <= request.zxid) {
ChangeRecord cr = zks.outstandingChanges.remove(0);
if (cr.zxid < request.zxid) {
LOG.warn("Zxid outstanding "
+ cr.zxid
+ " is less than current " + request.zxid);
}
if (zks.outstandingChangesForPath.get(cr.path) == cr) {
zks.outstandingChangesForPath.remove(cr.path);
}
}
if (request.hdr != null) {
TxnHeader hdr = request.hdr;
Record txn = request.txn;
// 触发节点属性更新逻辑
rc = zks.processTxn(hdr, txn);
}
// do not add non quorum packets to the queue.
if (Request.isQuorum(request.type)) {
zks.getZKDatabase().addCommittedProposal(request);
}
}
......
}
b.org.apache.zookeeper.server.ZKDatabase#processTxn核心逻辑
c. org.apache.zookeeper.server.DataTree#processTxn 节点数据模型对象更新
d. org.apache.zookeeper.server.WatchManager#triggerWatch(java.lang.String, org.apache.zookeeper.Watcher.Event.EventType) 触发客户端监听回调机制