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将所 ...
随机推荐
- MySQL 错误1418
创建function的时候报如下错误: Error Code : This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA ...
- Openssl aes加解密例程 更进一步
原文链接: http://blog.csdn.net/itmes/article/details/7718427 前面我们用openssl的aes256对称加密算法对16个字节的内存块进行了的加解密运 ...
- jQueryUI modal dialog does not show close button (x) JQueryUI和BootStrap混用时候,右上角关闭按钮显示不出图标的解决办法
I had this problem and was able to resolve it with the declaration below. $.fn.bootstrapBtn = $.fn.b ...
- zookeeper 的监控指标
一 应用场景描述 在目前公司的业务中,没有太多使用ZooKeeper作为协同服务的场景.但是我们将使用Codis作为Redis的集群部署方案,Codis依赖ZooKeeper来存储配置信息.所以做好Z ...
- Android开源之BaseRecyclerViewAdapterHelper(持续更新!)
官方地址:http://www.recyclerview.org/ 文档 v1.9.8 English 中文 v2.0.0 English 中文 Extension library PinnedSec ...
- ThinkPHP32 MODULE_ALLOW_LIST 存在的bug 不生效
1)BUG: 假设存在Api Home Admin Member 模块.仅仅想让用户訪问 Api Home,不同意訪问Admin Member. 必须将Admin Member 写在 MODULE_D ...
- 【Unity】7.6 自定义输入
分类:Unity.C#.VS2015 创建日期:2016-04-21 一.简介 在Unity中可以创建自定义的虚拟按键,然后将设备的输入映射到自定义的按键上.使用虚拟按键的好处是可以让游戏玩家自己定义 ...
- error occurred during the file system check
fsck -c 然后一路:y reboot 问题解决!!!
- How to install Hadoop Cluster
https://dwbi.org/etl/bigdata/183-setup-hadoop-cluster https://www.linode.com/docs/databases/hadoop/h ...
- An introduction to High Availability Architecture
https://www.getfilecloud.com/blog/an-introduction-to-high-availability-architecture/ An introduction ...