Gluster源代码阅读3--MGMT Xlator
引言
个人认为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相关推荐
- XV6源代码阅读-中断与系统调用
XV6源代码阅读-中断与系统调用 Exercise1 源代码阅读 1.启动部分: bootasm.S bootmain.c 和xv6初始化模块:main.c bootasm.S 由16位和32位汇编混 ...
- 非常好!!!Linux源代码阅读——环境准备【转】
Linux源代码阅读--环境准备 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/0_prepare.html 目录 Linux 系统环境准备 ...
- Tomcat源代码阅读系列之八:Tomcat 设计模式总结
本篇我们将来分析一下Tomcat中所涉及到设计模式,本文我们将主要来分析 外观模式 , 观察者模式 , 责任链模式 , 模板方法模式 , 命令模式 . 在开始本文之前,笔者先说明一下对于设计模式的一点 ...
- Linux 源代码阅读知识点及要求
说明:1.本次源代码阅读,以Linux 最新的稳定版本(2.6)为主: 2.源代码下载地址: 在官方站点 www.kernel.org 上最新稳定版本是 2.6.13.2: 在清华的 ftp 上随时都 ...
- 【转】Tomcat总体结构(Tomcat源代码阅读系列之二)
本文是Tomcat源代码阅读系列的第二篇文章,我们在本系列的第一篇文章:在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码一文中介绍了如何在intelliJ IDEA 和 Ec ...
- Linux 下源代码阅读工具 —— vim + TagList + CTags
为什么不采用 Windows 下较为著名的源代码阅读软件 SourceInsight, 其一,其在 Linux 下的安装较为繁琐: 其二,切换代码时背景色的变化会为人的眼部产生极为不舒服的感觉: 其三 ...
- XV6源代码阅读-虚拟内存管理
Exercise1 源代码阅读 内存管理部分: kalloc.c vm.c 以及相关其他文件代码 kalloc.c:char * kalloc(void)负责在需要的时候为用户空间.内核栈.页表页以及 ...
- ubuntu上安装源代码阅读工具Source-Navigator
在ubuntu中,一款相对比较方便的源代码阅读编辑工具Source-Navigator . 1,下载 http://sourcenav.sourceforge.net/download.html 下载 ...
- 一个好用的源代码阅读工具——Understand
Understand是一个用Qt写的跨平台源代码阅读工具,挺好用的,推荐一下. 一个商业软件.
- ROS源代码阅读(9)——DWA算法
2021SC@SDUSC ROS源代码阅读(9) 后面主要看dwa算法 DWAPlannerROS是封装类,提供了与move_base的接口,而DWAPlanner是具体实现类,它非常依赖costma ...
最新文章
- Brute Force算法介绍及C++实现
- vue 新手指引_精通react/vue组件设计之快速实现一个可定制的进度条组件
- java程序解压/压缩.gz文件
- ES6学习笔记之Promise
- 黄聪:C# 开发Chrome内核浏览器(WebKit.net)
- jQuery 对象及伪数组
- 终端链接操作redis
- scala把序列分解成子集(group by,partition)
- 如何自行找出 SAP Spartacus 查询用户信息的 API Service 类
- jquery去掉数组最后一个元素_从数组中删除最后一项
- 485光纤转换器产品分类介绍
- vba 正则表达式_VBA中正则表达式与数组结合的应用案例
- 后台经验分享:如何做权限管理系统设计?
- 设置合适的密码策略chage命令
- 为了你的账户安全,此WeChat ID 不能登入Wechat网页版。你可以.......
- 常用广告过滤规则整理
- Android 利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
- np.ravel()和np.flatten()
- 360路由器远程连接服务器,360路由器设置好了不能上网的解决办法
- word2016 上次启动时失败以安全模式能够解决该问题【office专业版】
热门文章
- 玩转云服务器,怎样用云服务器架设搭建游戏:浪剑天下架设教程,手把手教你架设游戏服务器,小白一看就会
- 前端自学学习笔记——JavaScript
- 怎样打印计算机桌面,敬业签电脑桌面便签软件怎么打印便签内容?
- PDF文件格式的特点
- 修复鹏城开发者云硬盘扩容报错 fdisk: cannot write disk label: Invalid argument
- delphi7中的指针
- wsl 设置阿里云源
- vue3 + vite中按需使用ace-builds实现编辑器
- C/C++ 16进制转IEEE754
- pip安装第三方库 报错:You should consider upgrading