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。这个方法会马上返回。
*/
;
/**
* 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的更多相关文章
- mongo源码学习(三)请求接收传输层
在上一篇博客中(mongo源码学习(二)db.cpp之mongoDbMain方法分析),我们把db.cpp中的mongoDbMain的执行过程分析了一下,最后会调用initAndListen(serv ...
- mongo源码学习(四)invariant
前言 在看MongoDB源码的时候,经常会看到这个玩意儿:invariant. invariant的字面意思是:不变式. 在emacs上跳转到函数定义要安装一个插件,ggtags,费了老大劲儿.这都可 ...
- dubbo源码学习(四):暴露服务的过程
dubbo采用的nio异步的通信,通信协议默认为 netty,当然也可以选择 mina,grizzy.在服务端(provider)在启动时主要是开启netty监听,在zookeeper上注册服务节点, ...
- Dubbo源码学习之-服务导出
前言 忙的时候,会埋怨学习的时间太少,缺少个人的空间,于是会争分夺秒的工作.学习.而一旦繁忙的时候过去,有时间了之后,整个人又会不自觉的陷入一种懒散的状态中,时间也显得不那么重要了,随便就可以浪费掉几 ...
- mongo源码学习(二)db.cpp之mongoDbMain方法分析
mongo后台进程的入口:mongo/src/mongo/db/dbmain.cpp,wmain(for windows)和main函数,main函数也很简单,就是委托给db.cpp中的mongoDb ...
- [spring源码学习]四、IOC源码——普通bean初始化
一.代码例子 此节开始涉及到一个bean具体生成和保存的过程,仅仅涉及到最简单的bean,代码依旧是最简单的 public static void main(String[] args) { Defa ...
- dubbo 源码学习1 服务发布机制
1.源码版本:2.6.1 源码demo中采用的是xml式的发布方式,在dubbo的 DubboNamespaceHandler 中定义了Spring Framework 的扩展标签,即 <dub ...
- mongo源码学习(一)
在git上把mongo的源码给拉下来了,然后目录大概是这样的: 这个mongo是用C++写的,编译并没有用Makefile而是用的scons工具,这个好像是python写的. mongo后台进程的入口 ...
- 菜鸟系列Fabric源码学习—orderer服务启动
Fabric 1.4 orderer 服务启动流程 1.提要 orderer提供broadcast和deliver两个服务接口.orderer节点与各个peer节点通过grpc连接,orderer将所 ...
随机推荐
- freeswitch订阅会议相关通知
一. freeswitch订阅会议相关通知 event plain CUSTOM conference::maintenance 这时会收到各种通知,会议创建.成员加入.成员离开.成员开始讲话,成员停 ...
- 谈谈MySQL的黑暗语法
[MySQL在SQL标准下实现了自己的一套SQL语句] 每种数据库都会在继承标准SQL的基础上有所发展,比如SQL-SERVER在这个基础之上发展出来的SQL“方言”就叫“T-SQL”,MySQL 发 ...
- MetInfo PHP的CMS,目测还不错
MetInfo PHP的CMS,目测还不错,先记录下来
- C# .net WPF无边框移动窗体
转自 http://download.csdn.net/detail/xiang348352/3095084 WPF无边框移动窗体,先在<Window>里添加 MouseLeftButto ...
- 一:php配置注意
display_errors string 该选项设置是否将错误信息作为输出的一部分显示到屏幕,或者对用户隐藏而不显示. 设置 "stderr" 表示发送到 stderr 而不是 ...
- 分享:三种取消选中单选框radio的方法
三种取消选中radio的方式,本文依赖于jQuery,其中第一种,第二种方式是使用jQuery实现的,第三种方式是基于JS和DOM实现的. <!DOCTYPE HTML> <html ...
- 【Unity】第9章 粒子系统
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 粒子是在三维空间中渲染出来的二维图像,主要用于在场景中表现如烟.火.水滴.落叶.--等各种效果. Unity粒子系统 ( ...
- mySql索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
- flash 拾遗
http://sourceforge.net/adobe/wiki/Projects/ http://www.adobe.com/devnet/air/air-sdk-download.html ht ...
- Asp.Net MVC简单三层架构(MVC5+EF6)
三层架构与MVC的关系 三层架构是一个分层式的软件体系架构设计,分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).分层的目的是为了实现“高内聚,低耦合”的思想,有利于系统后期的维护.更 ...