//如果我们还没有匹配上pending request, 则返回继续等待
if (nextPending != null) {
continue ;
}
synchronized (this ) {
//处理queuedRequests中下一个请求
while (nextPending == null && queuedRequests.size() > 0) {
//从queuedRequests中取出第一个,并将其从队列中删除
Request request = queuedRequests .remove();
switch (request.type ) {
case OpCode.create:
case OpCode.delete:
case OpCode.setData:
case OpCode.multi:
case OpCode.setACL:
case OpCode.createSession:
case OpCode.closeSession:
//如果不是OpCode.sync操作,则将request对象赋予nextPending
nextPending = request;
break ;
case OpCode.sync:
if (matchSyncs ) {
nextPending = request;
}
//如果matchSyncs等于false, 则直接加入到toProcess, 不等待Commit
else {
toProcess.add(request);
}
break ;
default :
toProcess.add(request);
}
}
}
}
} catch (InterruptedException e) {
LOG.warn( "Interrupted exception while waiting" , e);
} catch (Throwable e) {
LOG.error( "Unexpected exception causing CommitProcessor to exit", e);
}
LOG.info( "CommitProcessor exited loop!" );
}
【All Follower, Step 12】处理器FinalRequestProcessor更新内存中Session信息或者znode数据。
对于Follower A,将会构建Reponse,并返回Response给Client A;
对于其它的Follower, 不需要返回Response给客户端,直接返回。
FinalRequestProcessor.processRequest方法如下。其中构造Response部分,只给出了SetData请求相关的代码。