引言

个人认为Gluster有5大基础组件,分别是:MGMT,RPC Server,RPC Client, NFS Server,NFS Client

这5个组件组成了Gluster的基本服务,所以这一章节就是简单概述下MGMT做了哪些事情

MGMT,NFS,RPC-Server都使用相同的main函数(glusterfsd:main),所以这3类都有着相同加载流程,大致流程如下:

int main (int argc, char *argv[])

{

…….

ctx = glusterfs_ctx_new();

ret = glusterfs_globals_init ();

ret = glusterfs_ctx_defaults_init (ctx);

ret = parse_cmdline (argc, argv, ctx);

ret = logging_init (ctx);

gf_proc_dump_init();

ret = create_fuse_mount (ctx);

ret = daemonize (ctx); //变成daemon进程

ret = glusterfs_volumes_init (ctx); //这个函数里干的事情,非常重要

ret = event_dispatch (ctx->event_pool); //分发事件,参考3.3

}

从ctx的出现频率,拍脑袋都能想到ctx是一个非常重要的结构,它保存了许多的信息,至于有哪些,再以后的章节再进行扩展,但在这main里,前面所有的调用都是为2个重要的函数做铺垫

1、  glusterfs_volumes_init()

2、  event_dispatch()

在glusterfs_volumes_init() 里配置了不同的xlator(通过volfile-id,来决定配置哪些xlator),在gluster里xlator都是以一个模块化的组件.so的形式存在的,存放方路径是

所以加载不同的xlator,就等于加载了不同的glusterfsd的服务。

三种模式

Gluster有3种运行模式,分别是:

GF_SERVER_PROCESS,GF_GLUSTERD_PROCESS,GF_CLIENT_PROCESS

虽然3个命令指向的是同一个文件(参考图1-1),但是这个文件确有3种模式

static uint8_t

gf_get_process_mode (char *exec_name)

{

char *dup_execname = NULL, *base = NULL;

uint8_t ret = 0;

dup_execname = gf_strdup (exec_name);

base = basename (dup_execname);

if (!strncmp (base, "glusterfsd", 10)) {

ret = GF_SERVER_PROCESS; (VOLUME,NFS,RPC Server)

} else if (!strncmp (base, "glusterd", 8)) {

ret = GF_GLUSTERD_PROCESS; (Daemon)

} else {

ret = GF_CLIENT_PROCESS; (RPC Client)

}

GF_FREE (dup_execname);

return ret;

}

解析命令行参数

利用了argp包,解析命令行顺序,具体详情参考

http://www.gnu.org/software/libc/manual/html_node/Argp-Examples.html#Argp-Examples

#0 parse_opts(key=16777219, arg=0x0, state=0x7fffffffce70) at glusterfsd.c:780

#1 0x00007ffff62cfc9bin argp_parse () from /lib64/libc.so.6--这是个so里的函数

#2 0x0000000000409001in parse_cmdline (argc=6, argv=0x7fffffffe578, ctx=0x617010) atglusterfsd.c:1793

#3 0x000000000040a1dfin main (argc=6, argv=0x7fffffffe578) at glusterfsd.c:2296

Event_dispatch

在glusterfs_ctx_defaults_init里被初始化

在gluster里使用了大量的函数指针,所以如何找到指针对应的函数,非常有助于代码的阅读,下面2个struct,定了对应的event函数

//event.h

struct event_ops {

struct event_pool * (*new) (int count,int eventthreadcount);

int (*event_register) (structevent_pool *event_pool, int fd,

event_handler_thandler,

void *data, intpoll_in, int poll_out);

int (*event_select_on) (structevent_pool *event_pool, int fd, int idx,

int poll_in,int poll_out);

int (*event_unregister) (structevent_pool *event_pool, int fd, int idx);

int (*event_unregister_close) (structevent_pool *event_pool, int fd,

int idx);

int (*event_dispatch) (structevent_pool *event_pool);

int (*event_reconfigure_threads)(struct event_pool *event_pool,

intnewcount);

int (*event_pool_destroy) (structevent_pool *event_pool);

};

//event-epoll.c

struct event_opsevent_ops_epoll = {

.new                       = event_pool_new_epoll,

.event_register            = event_register_epoll,

.event_select_on           =event_select_on_epoll,

.event_unregister          = event_unregister_epoll,

.event_unregister_close    = event_unregister_close_epoll,

.event_dispatch            = event_dispatch_epoll,

.event_reconfigure_threads =event_reconfigure_threads_epoll,

.event_pool_destroy        = event_pool_destroy_epoll

};

不管那种模式,都使用epoll,并在event-dispatch分发事件

event_pool->ops->event_dispacth这里是函数指针的调用,参考structops的真正指向是event_dispatch_epoll,并利用一个单独的线程worker去处理所有事件

XLATOR的加载

在默认情况下,glusterd会使用/etc/glusterfs/glusterd.vol来初始化xlator

1:volume management

2:     type mgmt/glusterd

3:     optionrpc-auth.auth-glusterfs on

4:     option rpc-auth.auth-unixon

5:     option rpc-auth.auth-nullon

6:     optionrpc-auth-allow-insecure on

7:     optiontransport.socket.listen-backlog 128

8:     option event-threads 1

9:     option ping-timeout 0

10:    option transport.socket.read-fail-log off

11:     optiontransport.socket.keepalive-interval 2

12:    option transport.socket.keepalive-time 10

13:    option transport-type rdma

14:    option working-directory /var/lib/glusterd

15:end-volume

其中xl指向是当前的xlaotor(mgmt),glusterd.c:init()

在glusterd.c:init()里初始化了RPC服务

不同的xlator组成的堆栈结构,称为一个graph

Gluster源代码阅读3--MGMT Xlator相关推荐

  1. XV6源代码阅读-中断与系统调用

    XV6源代码阅读-中断与系统调用 Exercise1 源代码阅读 1.启动部分: bootasm.S bootmain.c 和xv6初始化模块:main.c bootasm.S 由16位和32位汇编混 ...

  2. 非常好!!!Linux源代码阅读——环境准备【转】

    Linux源代码阅读--环境准备 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/0_prepare.html 目录 Linux 系统环境准备 ...

  3. Tomcat源代码阅读系列之八:Tomcat 设计模式总结

    本篇我们将来分析一下Tomcat中所涉及到设计模式,本文我们将主要来分析 外观模式 , 观察者模式 , 责任链模式 , 模板方法模式 , 命令模式 . 在开始本文之前,笔者先说明一下对于设计模式的一点 ...

  4. Linux 源代码阅读知识点及要求

    说明:1.本次源代码阅读,以Linux 最新的稳定版本(2.6)为主: 2.源代码下载地址: 在官方站点 www.kernel.org 上最新稳定版本是 2.6.13.2: 在清华的 ftp 上随时都 ...

  5. 【转】Tomcat总体结构(Tomcat源代码阅读系列之二)

    本文是Tomcat源代码阅读系列的第二篇文章,我们在本系列的第一篇文章:在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码一文中介绍了如何在intelliJ IDEA 和 Ec ...

  6. Linux 下源代码阅读工具 —— vim + TagList + CTags

    为什么不采用 Windows 下较为著名的源代码阅读软件 SourceInsight, 其一,其在 Linux 下的安装较为繁琐: 其二,切换代码时背景色的变化会为人的眼部产生极为不舒服的感觉: 其三 ...

  7. XV6源代码阅读-虚拟内存管理

    Exercise1 源代码阅读 内存管理部分: kalloc.c vm.c 以及相关其他文件代码 kalloc.c:char * kalloc(void)负责在需要的时候为用户空间.内核栈.页表页以及 ...

  8. ubuntu上安装源代码阅读工具Source-Navigator

    在ubuntu中,一款相对比较方便的源代码阅读编辑工具Source-Navigator . 1,下载 http://sourcenav.sourceforge.net/download.html 下载 ...

  9. 一个好用的源代码阅读工具——Understand

    Understand是一个用Qt写的跨平台源代码阅读工具,挺好用的,推荐一下. 一个商业软件.

  10. ROS源代码阅读(9)——DWA算法

    2021SC@SDUSC ROS源代码阅读(9) 后面主要看dwa算法 DWAPlannerROS是封装类,提供了与move_base的接口,而DWAPlanner是具体实现类,它非常依赖costma ...

最新文章

  1. Brute Force算法介绍及C++实现
  2. vue 新手指引_精通react/vue组件设计之快速实现一个可定制的进度条组件
  3. java程序解压/压缩.gz文件
  4. ES6学习笔记之Promise
  5. 黄聪:C# 开发Chrome内核浏览器(WebKit.net)
  6. jQuery 对象及伪数组
  7. 终端链接操作redis
  8. scala把序列分解成子集(group by,partition)
  9. 如何自行找出 SAP Spartacus 查询用户信息的 API Service 类
  10. jquery去掉数组最后一个元素_从数组中删除最后一项
  11. 485光纤转换器产品分类介绍
  12. vba 正则表达式_VBA中正则表达式与数组结合的应用案例
  13. 后台经验分享:如何做权限管理系统设计?
  14. 设置合适的密码策略chage命令
  15. 为了你的账户安全,此WeChat ID 不能登入Wechat网页版。你可以.......
  16. 常用广告过滤规则整理
  17. Android 利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
  18. np.ravel()和np.flatten()
  19. 360路由器远程连接服务器,360路由器设置好了不能上网的解决办法
  20. word2016 上次启动时失败以安全模式能够解决该问题【office专业版】

热门文章

  1. 玩转云服务器,怎样用云服务器架设搭建游戏:浪剑天下架设教程,手把手教你架设游戏服务器,小白一看就会
  2. 前端自学学习笔记——JavaScript
  3. 怎样打印计算机桌面,敬业签电脑桌面便签软件怎么打印便签内容?
  4. PDF文件格式的特点
  5. 修复鹏城开发者云硬盘扩容报错 fdisk: cannot write disk label: Invalid argument
  6. delphi7中的指针
  7. wsl 设置阿里云源
  8. vue3 + vite中按需使用ace-builds实现编辑器
  9. C/C++ 16进制转IEEE754
  10. pip安装第三方库 报错:You should consider upgrading