在上一篇博客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。这个方法会马上返回。*/virtual void startSession(transport::SessionHandle session) = 0;/*** End all sessions that do not match the mask in tags.*//*** 结束所有和tags中掩码不匹配的sessions。*/virtual void endAllSessions(transport::Session::TagMask tags) = 0;/*** Starts the service entry point*//*** 启动服务入口点。*/virtual Status start() = 0;/*** Shuts down the service entry point.*//*** 关闭服务入口点。*/virtual bool shutdown(Milliseconds timeout) = 0;/*** Append high-level stats to a BSONObjBuilder for serverStatus*//*** 为serverStatus向BSONObjBuilder追加高级状态。*/virtual void appendStats(BSONObjBuilder* bob) const = 0;/*** Returns the number of sessions currently open.*//*** 返回当前打开的sessions数量。*/virtual size_t numOpenSessions() const = 0;/*** Processes a request and fills out a DbResponse.*//*** 处理一个请求并写入DbResponse。* P. S. 敲黑板了, 同志们,这里就是处理请求的地方了啊!*/virtual DbResponse handleRequest(OperationContext* opCtx, const Message& request) = 0;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{0};AtomicWord<size_t> _createdConnections{0};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. dubbo源码学习(四):暴露服务的过程

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

  2. netty源码学习之服务端客户端初始化

    文章目录 1. AbstractBootstrap类简介 1.1. 核心方法 2. netty服务端创建 2.1. 服务端启动入口 2.2. doBind()方法 2.3. netty服务初始化 2. ...

  3. mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...

  4. 第十四课 k8s源码学习和二次开发原理篇-调度器原理

    第十四课 k8s源码学习和二次开发原理篇-调度器原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第十四课 k8s源码学习和二次开发原理篇-调度器原理 第一节 ...

  5. 第四课 k8s源码学习和二次开发-DeltaFIFO和Indexer原理学习

    第四课 k8s源码学习和二次开发-DeltaFIFO和Indexer原理学习 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第四课 k8s源码学习和二次开发-De ...

  6. Spring源码学习(四) | @Configuration的cglib动态代理

    文章目录 前言 例子 @Configuration :full or lite 设置 full or lite Cglib生成代理类AppConfig Where is it generated Ho ...

  7. postgresql源码学习(57)—— pg中的四种动态库加载方法

    一. 基础知识 1. 什么是库 库其实就是一些通用代码,可以在程序中重复使用,比如一些数学函数,可以不需要自己编写,直接调用相关函数即可实现,避免重复造轮子. 在linux中,支持两种类型的库: 1. ...

  8. ASP.NET Core 源码学习之 Logging[2]:Configure

    在上一章中,我们对 ASP.NET Logging 系统做了一个整体的介绍,而在本章中则开始从最基本的配置开始,逐步深入到源码当中去. 默认配置 在 ASP.NET Core 2.0 中,对默认配置做 ...

  9. 第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理

    第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第八课 ...

最新文章

  1. python删除csv某一行_Python如何修改CSV的某一行/列的值
  2. 百度Q2日进2.9个亿,新基建推动Apollo上位!李彦宏开招管培生:亲自选亲自带...
  3. 【Linux入门到精通系列讲解】.bashrc 文件作用
  4. 关于ContinuationFilter的使用
  5. icloud连接服务器时出现问题_ios13 ipad/iphone与windows 连接传输文件显示连接服务器用户或密码无效解决方法...
  6. 03_pandas布尔索引、isin()筛选、设置值at和iat,loc,reindex、dropna、fillna,isna、求平均值mean、Apply函数、value_counts
  7. Python自动生成10000个java类使用APT注解后引发的问题
  8. Tomcat服务脚本
  9. Kafka将逐步弃用对zookeeper的依赖
  10. 3GPP(3rd Generation Partnership Project)
  11. qt为lineedit添加背景图片代码_Qt中事件的理解(2)
  12. 微信小程序 获取php值,微信小程序如何获取javascript里的数据
  13. Atitit gis之道 attilax著
  14. day03-搭建项目
  15. 蔚来、宁德时代的换电攻坚战
  16. 计算机考研和不考研的区别,考研和不考研有什么区别?问清楚自己考研动机
  17. Pod状态异常排查问题集-pending状态排查思路
  18. web前端(HTML的CSS样式和JavaScript)
  19. 最新小程序反编译详细教程,亲测可用
  20. 【Python免费网站】2021学习python 5个绝佳的网站,新手小白再也不怕学不会!

热门文章

  1. 两个Listbox的关联(省名 和 该省城市的对应)
  2. linux 必知命令
  3. 讨论下怎么能实现保证新闻时效性推荐算法机制
  4. Collections.unmodifiableCollection
  5. “考虑对方的感受”之案例
  6. 40vf什么意思_LED 的基本术语VF、IV、WL、IR 解释及光通量换算关系
  7. 二叉树遍历的非递归算法
  8. 如何避免数据治理过程的误区
  9. 数据可视化的十大优点
  10. 三大运营商的物联网卡如何收费