在上一篇博客mongo源码学习(三)请求接收传输层中,稍微分析了一下TransportLayer的作用,这篇来看下ServiceEntryPoint是怎么做的。

首先ServiceEntryPoint的定义在mongo/src/mongo/transport目录下。

废话不过说,直接上代码。

service_entry_point.h

namespace mongo {

/**
 * This is the entrypoint from the transport layer into mongod or mongos.
 *
 * The ServiceEntryPoint accepts new Sessions from the TransportLayer, and is
 * responsible for running these Sessions in a get-Message, run-Message,
 * reply-with-Message loop.  It may not do this on the TransportLayer’s thread.
 */
/**
 * 这是从transport layer到mongod或者mongos的入口点。
 *
 * ServiceEntryPoint从TransportLayer中接收新的Session,并且负责运行这些Sessions的
 * get-Message,run-Message和reply-with-Message生命周期。它可能不会在TransportLayer的线程
 * 中这些事情。
 */
class ServiceEntryPoint {
    MONGO_DISALLOW_COPYING(ServiceEntryPoint);

public:
    virtual ~ServiceEntryPoint() = default;

    /**
     * Begin running a new Session. This method returns immediately.
     */
    /**
     * 开始一个新的Session。这个方法会马上返回。
     */
    ;

    /**
     * End all sessions that do not match the mask in tags.
     */
    /**
     * 结束所有和tags中掩码不匹配的sessions。
     */
    ;

    /**
     * Starts the service entry point
     */
    /**
     * 启动服务入口点。
     */
    ;

    /**
    * Shuts down the service entry point.
    */
    /**
     * 关闭服务入口点。
     */
    ;

    /**
     * Append high-level stats to a BSONObjBuilder for serverStatus
     */
    /**
     * 为serverStatus向BSONObjBuilder追加高级状态。
     */
    ;

    /**
    * Returns the number of sessions currently open.
    */
    /**
     * 返回当前打开的sessions数量。
     */
    ;

    /**
     * Processes a request and fills out a DbResponse.
     */
    /**
     * 处理一个请求并写入DbResponse。
     * P. S. 敲黑板了, 同志们,这里就是处理请求的地方了啊!
     */
    ;

protected:
    ServiceEntryPoint() = default;
};

}  // namespace mongo

嗯,我觉得最重要的方法就是handleRequest了,接口中方法名字取的通俗易懂,没毛病。

service_entry_pioint_impl.h

namespace mongo {
class ServiceContext;

namespace transport {
class Session;
}  // namespace transport

/**
 * A basic entry point from the TransportLayer into a server.
 *
 * The server logic is implemented inside of handleRequest() by a subclass.
 * startSession() spawns and detaches a new thread for each incoming connection
 * (transport::Session).
 */
/**
 * 从TransportLayer到server的一个基本入口点。
 *
 * 服务器处理请求的逻辑是通过子类的handleRequest()方法实现的。
 * startSession()会spawns并且分配一个新的线程来处理每个到来的连接(transport:Session)
 * spawn: (鱼、蛙等)大量产(卵);引起,酿成
 *
 */
class ServiceEntryPointImpl : public ServiceEntryPoint {
    MONGO_DISALLOW_COPYING(ServiceEntryPointImpl);

public:
    // 构造函数
    explicit ServiceEntryPointImpl(ServiceContext* svcCtx);

    void startSession(transport::SessionHandle session) override;

    void endAllSessions(transport::Session::TagMask tags) final;

    Status start() final;
    bool shutdown(Milliseconds timeout) final;

    void appendStats(BSONObjBuilder* bob) const final;

    size_t numOpenSessions() const final {
        return _currentConnections.load();
    }

private:
    using SSMList = stdx::list<std::shared_ptr<ServiceStateMachine>>;
    using SSMListIterator = SSMList::iterator;

    ServiceContext* const _svcCtx;
    AtomicWord<std::size_t> _nWorkers;

    mutable stdx::mutex _sessionsMutex;
    stdx::condition_variable _shutdownCondition;
    SSMList _sessions;

    size_t _maxNumConnections{DEFAULT_MAX_CONN};
    AtomicWord<size_t> _currentConnections{};
    AtomicWord<size_t> _createdConnections{};

    std::unique_ptr<transport::ServiceExecutorReserved> _adminInternalPool;
};

/*
 * Returns true if a session with remote/local addresses should be exempted from maxConns
 */
/*
 * 如果远程或本地的session可以从最大连接数约束中豁免则返回true
 */
bool shouldOverrideMaxConns(const transport::SessionHandle& session,
                            const std::vector<stdx::variant<CIDR, std::string>>& exemptions);

}  // namespace mongo

似乎也没有太多好说的了。接下来的service_entry_point_impl.cpp是大头,这里开始要深入到方法内部去了。

service_entry_point_impl.cpp

mongo源码学习(四)服务入口点ServiceEntryPoint的更多相关文章

  1. mongo源码学习(三)请求接收传输层

    在上一篇博客中(mongo源码学习(二)db.cpp之mongoDbMain方法分析),我们把db.cpp中的mongoDbMain的执行过程分析了一下,最后会调用initAndListen(serv ...

  2. mongo源码学习(四)invariant

    前言 在看MongoDB源码的时候,经常会看到这个玩意儿:invariant. invariant的字面意思是:不变式. 在emacs上跳转到函数定义要安装一个插件,ggtags,费了老大劲儿.这都可 ...

  3. dubbo源码学习(四):暴露服务的过程

    dubbo采用的nio异步的通信,通信协议默认为 netty,当然也可以选择 mina,grizzy.在服务端(provider)在启动时主要是开启netty监听,在zookeeper上注册服务节点, ...

  4. Dubbo源码学习之-服务导出

    前言 忙的时候,会埋怨学习的时间太少,缺少个人的空间,于是会争分夺秒的工作.学习.而一旦繁忙的时候过去,有时间了之后,整个人又会不自觉的陷入一种懒散的状态中,时间也显得不那么重要了,随便就可以浪费掉几 ...

  5. mongo源码学习(二)db.cpp之mongoDbMain方法分析

    mongo后台进程的入口:mongo/src/mongo/db/dbmain.cpp,wmain(for windows)和main函数,main函数也很简单,就是委托给db.cpp中的mongoDb ...

  6. [spring源码学习]四、IOC源码——普通bean初始化

    一.代码例子 此节开始涉及到一个bean具体生成和保存的过程,仅仅涉及到最简单的bean,代码依旧是最简单的 public static void main(String[] args) { Defa ...

  7. dubbo 源码学习1 服务发布机制

    1.源码版本:2.6.1 源码demo中采用的是xml式的发布方式,在dubbo的 DubboNamespaceHandler 中定义了Spring Framework 的扩展标签,即 <dub ...

  8. mongo源码学习(一)

    在git上把mongo的源码给拉下来了,然后目录大概是这样的: 这个mongo是用C++写的,编译并没有用Makefile而是用的scons工具,这个好像是python写的. mongo后台进程的入口 ...

  9. 菜鸟系列Fabric源码学习—orderer服务启动

    Fabric 1.4 orderer 服务启动流程 1.提要 orderer提供broadcast和deliver两个服务接口.orderer节点与各个peer节点通过grpc连接,orderer将所 ...

随机推荐

  1. background-size ie8不支持怎么解决

    background-size这个属性是css3,新增的属性,现在很多浏览器已经支持了,但是IE系列的浏览器却没有支持,比如IE8,下面介绍下如何解决这个问题 在IE浏览器中,可以通过滤镜filter ...

  2. Oracle 12C -- ADR结构

    ADR路径由参数diagnostic_dest参数决定: SQL> show parameter diagnostic_dest NAME TYPE VALUE ---------------- ...

  3. [Warning] TIMESTAMP with implicit DEFAULT value is deprecated

    启动mysql时,报如下警告信息: [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explic ...

  4. 【转】写给支持和反对《完全用Linux工作》的人们

    早就有人问起我的学习情况,问我有没有找到理想的研究环境.我却总是弄一些小动物,要不就是好玩的内容在这上面.真是惭愧,因为一直觉得自己还没有什么发言权,一直觉得是不是自己搞错了.不过来了 Cornell ...

  5. SharePoint自动化部署,利用PowerShell 导出/导入AD中的用户

    这几个月一直在帮客户改需求,部署.我已经心力憔悴,经过一段时间的摸索,我对用PowerShell实现自动化部署也有了一些心得,比如说利用PowerShell导出导入AD中的User.在基于ShareP ...

  6. CentOS扩展库配置

    背景:经常用到第三方的库,通过yum命令查询不到.例如:yum search ilbcWarning: No matches found for: ilbc 不要感叹,CentOS没你想象的支持力度那 ...

  7. Spring JavaConfig

    以前,Spring推荐使用XML的方式来定义Bean及Bean之间的装配规则,但是在Spring3.0之后,Spring提出的强大的JavaConfig这种类型安全的Bean装配方式,它基于Java代 ...

  8. 交叉验证(CrossValidation)方法思想简介[zz]

    以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train se ...

  9. python 元类(metaclass)

    元类参见老师的博客 http://www.cnblogs.com/linhaifeng/articles/8029564.html

  10. Android网络功能之会话发起协议SIP

    原文:http://android.eoe.cn/topic/android_sdk * 会话发起协议* Android提供了一个支持会话发起协议(SIP)的API,这可以让你添加基于SIP的网络电话 ...