ZooKeeper源码分析:Quorum请求的整个流程(10)


                //如果我们还没有匹配上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请求相关的代码。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/bf8a6d0ea7831f3c07af4e6087dbcc6f.html