mongo源码学习(四)服务入口点ServiceEntryPoint
在上一篇博客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相关推荐
- dubbo源码学习(四):暴露服务的过程
dubbo采用的nio异步的通信,通信协议默认为 netty,当然也可以选择 mina,grizzy.在服务端(provider)在启动时主要是开启netty监听,在zookeeper上注册服务节点, ...
- netty源码学习之服务端客户端初始化
文章目录 1. AbstractBootstrap类简介 1.1. 核心方法 2. netty服务端创建 2.1. 服务端启动入口 2.2. doBind()方法 2.3. netty服务初始化 2. ...
- mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...
前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...
- 第十四课 k8s源码学习和二次开发原理篇-调度器原理
第十四课 k8s源码学习和二次开发原理篇-调度器原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第十四课 k8s源码学习和二次开发原理篇-调度器原理 第一节 ...
- 第四课 k8s源码学习和二次开发-DeltaFIFO和Indexer原理学习
第四课 k8s源码学习和二次开发-DeltaFIFO和Indexer原理学习 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第四课 k8s源码学习和二次开发-De ...
- Spring源码学习(四) | @Configuration的cglib动态代理
文章目录 前言 例子 @Configuration :full or lite 设置 full or lite Cglib生成代理类AppConfig Where is it generated Ho ...
- postgresql源码学习(57)—— pg中的四种动态库加载方法
一. 基础知识 1. 什么是库 库其实就是一些通用代码,可以在程序中重复使用,比如一些数学函数,可以不需要自己编写,直接调用相关函数即可实现,避免重复造轮子. 在linux中,支持两种类型的库: 1. ...
- ASP.NET Core 源码学习之 Logging[2]:Configure
在上一章中,我们对 ASP.NET Logging 系统做了一个整体的介绍,而在本章中则开始从最基本的配置开始,逐步深入到源码当中去. 默认配置 在 ASP.NET Core 2.0 中,对默认配置做 ...
- 第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理
第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第八课 ...
最新文章
- python删除csv某一行_Python如何修改CSV的某一行/列的值
- 百度Q2日进2.9个亿,新基建推动Apollo上位!李彦宏开招管培生:亲自选亲自带...
- 【Linux入门到精通系列讲解】.bashrc 文件作用
- 关于ContinuationFilter的使用
- icloud连接服务器时出现问题_ios13 ipad/iphone与windows 连接传输文件显示连接服务器用户或密码无效解决方法...
- 03_pandas布尔索引、isin()筛选、设置值at和iat,loc,reindex、dropna、fillna,isna、求平均值mean、Apply函数、value_counts
- Python自动生成10000个java类使用APT注解后引发的问题
- Tomcat服务脚本
- Kafka将逐步弃用对zookeeper的依赖
- 3GPP(3rd Generation Partnership Project)
- qt为lineedit添加背景图片代码_Qt中事件的理解(2)
- 微信小程序 获取php值,微信小程序如何获取javascript里的数据
- Atitit gis之道 attilax著
- day03-搭建项目
- 蔚来、宁德时代的换电攻坚战
- 计算机考研和不考研的区别,考研和不考研有什么区别?问清楚自己考研动机
- Pod状态异常排查问题集-pending状态排查思路
- web前端(HTML的CSS样式和JavaScript)
- 最新小程序反编译详细教程,亲测可用
- 【Python免费网站】2021学习python 5个绝佳的网站,新手小白再也不怕学不会!