Ceph网络模块代码浅析(1)
2017-10-09 00:00
148 查看
摘要: 这是<Ceph网络模块代码浅析>的第一篇文章. 和大多数网络通信模型一样,这里也离不开客户端和服务端, 在这篇文章中先介绍下服务端的启动和初始化流程吧.以及需要用到的相关数据结构.
Ceph版本: Firefly 0.80.7
在这里函数这里创建了若干个Messenger实例,ms_public实例只是其中的一个.从这个函数参数"client"也能看出一些端倪,说明这个Messenger是专门用于
处理"客户端"的消息的,这里的客户端指的是诸如RGW, RBD这样的客户端. 而后面的ms_cluster则处理与其它OSD的消息。
Messenger是一个抽象类, ms_public是一个基类指针.
而类SimpleMessenger继承自Messenger.
最终调用的bind()函数是子类SimpleMessenger::bind(const entity_addr_t &bind_addr)
这里的entity_addr_t实际是socket通信中需要用到的sockaddr_in,AF_INET/AF_INET6的集合.
继续调用成员accepter.bind(bind_addr, avoid_ports);
在msg/Accepter.cc中可以看到:
这个函数执行了:
1)创建一个socket fd.
2)执行bind()
3)执行listen()
以上都是socket编程中基本操作步骤.
实际上调用的是:
从这里可以看出,reaper_thread.create()创建了一个reaper线程.找到它的void *entry()函数.//SimpleMessenger.h
reaper线程实际上执行的是void SimpleMessenger::reaper_entry(), 它最终执行/调用
7fe0
的是:
从这里可以看出做出了清理Pipe的操作. (?)
通过以上4步, OSD(服务端)关于网络方面的工作算是初始化完毕了.工作只是准备阶段,并不复杂.
Ceph版本: Firefly 0.80.7
1. 创建消息管理类Messenger.
Messenger *ms_public = Messenger::create(g_ceph_context, entity_name_t::OSD(whoami), "client", getpid());
在这里函数这里创建了若干个Messenger实例,ms_public实例只是其中的一个.从这个函数参数"client"也能看出一些端倪,说明这个Messenger是专门用于
处理"客户端"的消息的,这里的客户端指的是诸如RGW, RBD这样的客户端. 而后面的ms_cluster则处理与其它OSD的消息。
2. 绑定端口和地址
然后在后面,就像Linux Socket编程一样, 在这里也需要调用bind()函数完成端口以及地址的绑定, 只不过这里bind()函数是经过特殊封装后的.ms_public->bind(g_conf->public_addr);
Messenger是一个抽象类, ms_public是一个基类指针.
而类SimpleMessenger继承自Messenger.
最终调用的bind()函数是子类SimpleMessenger::bind(const entity_addr_t &bind_addr)
int SimpleMessenger::bind(const entity_addr_t &bind_addr) { lock.Lock(); if (started) { ldout(cct,10) << "rank.bind already started" << dendl; lock.Unlock(); return -1; } ldout(cct,10) << "rank.bind " << bind_addr << dendl; lock.Unlock(); // bind to a socket set<int> avoid_ports; int r = accepter.bind(bind_addr, avoid_ports); if (r >= 0) did_bind = true; return r; }
这里的entity_addr_t实际是socket通信中需要用到的sockaddr_in,AF_INET/AF_INET6的集合.
继续调用成员accepter.bind(bind_addr, avoid_ports);
在msg/Accepter.cc中可以看到:
int Accepter::bind(const entity_addr_t &bind_addr, const set<int>& avoid_ports)
这个函数执行了:
1)创建一个socket fd.
2)执行bind()
3)执行listen()
以上都是socket编程中基本操作步骤.
3. 启动"服务端"
ms_public->start();
实际上调用的是:
int SimpleMessenger::start() { lock.Lock(); ldout(cct,1) << "messenger.start" << dendl; // register at least one entity, first! assert(my_type >= 0); assert(!started); started = true; if (!did_bind) { my_inst.addr.nonce = nonce; init_local_connection(); } lock.Unlock(); reaper_started = true; reaper_thread.create(); return 0; }
从这里可以看出,reaper_thread.create()创建了一个reaper线程.找到它的void *entry()函数.//SimpleMessenger.h
reaper线程实际上执行的是void SimpleMessenger::reaper_entry(), 它最终执行/调用
7fe0
的是:
void SimpleMessenger::reaper() { ldout(cct,10) << "reaper" << dendl; assert(lock.is_locked()); while (!pipe_reap_queue.empty()) { Pipe *p = pipe_reap_queue.front(); pipe_reap_queue.pop_front(); ldout(cct,10) << "reaper reaping pipe " << p << " " << p->get_peer_addr() << dendl; p->pipe_lock.Lock(); p->discard_out_queue(); if (p->connection_state) { // mark_down, mark_down_all, or fault() should have done this, // or accept() may have switch the Connection to a different // Pipe... but make sure! bool cleared = p->connection_state->clear_pipe(p); assert(!cleared); } p->pipe_lock.Unlock(); p->unregister_pipe(); assert(pipes.count(p)); pipes.erase(p); p->join(); if (p->sd >= 0) ::close(p->sd); ldout(cct,10) << "reaper reaped pipe " << p << " " << p->get_peer_addr() << dendl; p->put(); ldout(cct,10) << "reaper deleted pipe " << p << dendl; } ldout(cct,10) << "reaper done" << dendl; }
从这里可以看出做出了清理Pipe的操作. (?)
4. 最后一步:
delete ms_public;
通过以上4步, OSD(服务端)关于网络方面的工作算是初始化完毕了.工作只是准备阶段,并不复杂.
相关文章推荐
- Ceph网络层代码浅析(3)
- Ceph网络模块(3)——AsyncMessenger代码流程分析
- Ceph网络模块(2) - AsyncMessenger组织结构
- MySQL · 源码分析 · 网络通信模块浅析
- Node.js之网络通讯模块实现浅析
- 浅析 Node.js 的 vm 模块以及运行不信任代码
- 关于原子哥ENC28J60网络通信模块接收数据代码的一点疑惑
- ENC28J60网络模块驱动代码
- OpenStack中网络模块(Neutron)的代码分析
- Android xUtils3源代码解析之网络模块
- Ceph网络模块介绍
- Libgdx: android单机斗地主支持局域网wifi联网的网络模块核心代码
- 浅析 Node.js 的 vm 模块以及运行不信任代码
- 网络游戏中网络模块浅析
- BCache源码浅析之一基本使用与代码模块
- ceph源码网络模块读取数据流程
- 浅析 Node.js 的 vm 模块以及运行不信任代码
- 网络游戏中网络模块浅析
- Libgdx: android单机斗地主支持局域网wifi联网的网络模块核心代码
- Ceph网络模块(2) - AsyncMessenger数据结构分析