千家信息网

Ceph网络模块代码的示例分析

发表于:2025-01-25 作者:千家信息网编辑
千家信息网最后更新 2025年01月25日,这篇文章主要为大家展示了"Ceph网络模块代码的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Ceph网络模块代码的示例分析"这篇文章吧。1. 创
千家信息网最后更新 2025年01月25日Ceph网络模块代码的示例分析

这篇文章主要为大家展示了"Ceph网络模块代码的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Ceph网络模块代码的示例分析"这篇文章吧。

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 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& 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(), 它最终执行/调用的是:

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网络模块代码的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

函数 网络 代码 模块 示例 分析 内容 实际 客户 客户端 消息 篇文章 只是 地址 实例 实际上 端口 线程 处理 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 电脑安装服务器里的安装包卡顿 软件开发经验不重要 目前比较厉害的网络技术 计算机网络技术应用是哪类 江西德诺科技互联网有限公司 轻量云服务器能做什么网站 集控软件开发服务与组态软件 最新的网络技术案例 软件开发过程 ppt 凡尘互联网科技 上海助力智慧校园软件开发 嗖嗖互联网科技有限公司 如何使用服务器搭建nas 手机网络安全类型在哪里查看 计算机网络技术艺术设计 网络安全学习哪些知识 医院信息管理系统数据库技术设计 计算机三级数据库怎么多得分 软件开发及小分析 芜湖租赁软件开发平台 基带软件开发工程师 网络安全关于应急响应的目标 腾讯云增加服务器 网络安全等级考试通过率 java并发服务器搭建 山西智高软件开发有限公司 mdb 数据库怎么用 asp添加数据库记录代码 北京市网络安全法实施细则 服务器进入不了安全模式
0