gluster源码浅析

gluster源码浅析gluster的volume是由一系列的translator组成的,translator就像输入输出流的堆栈式结构一样,由一个translator调用另一个translator,每个translator在运行时作为shared-object,根据不同的文件操作调用不同的函数.每个translator一般需要定义xlator_fops、xlator_cbks、init、fini、volume…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定
gluster的volume是由一系列的translator组成的,translator就像输入输出流的堆栈式结构一样,由一个translator调用另一个translator,每个translator在运行时作为shared-object,根据不同的文件操作调用不同的函数.

每个translator一般需要定义xlator_fops、xlator_cbks、init、fini、volume_options这几个结构体.结构体里是不同的函数指针

比较重要的是xlator_fops这个结构体,在这里,一般要定义规定好的文件操作,文件操作在xlator.h中都有严格的明确定义

比如

fop_readv_t readv;

fop_writev_t writev;

应该就是对文件内容写入和读出的操作

translator都是采用异步调用和callback的方式,上一个translator异步调用下一个translator的相应的函数,下一个translator完成后调用上一个translator的callback函数.调用和callback主要利用了两个宏,STACK_WIND和STACK_UNWIND

gluster的translator中,一般都能很容易找到文件操作和相应的回调函数,因为命名都很有规律

拿一个简单的rot 13的translator举例说明下

rot-13.c文件中定义了两个文件操作

struct xlator_fops fops = {
  
  
.readv = rot13_readv,
.writev = rot13_writev
};

Jetbrains全家桶1年46,售后保障稳定

即文件读取和文件写入操作

在上面可以找到

int32_t
rot13_writev_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
struct iatt *prebuf,
struct iatt *postbuf, dict_t *xdata)
{
STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, prebuf, postbuf,
xdata);
return 0;
}

int32_t
rot13_writev (call_frame_t *frame,
xlator_t *this,
fd_t *fd,
struct iovec *vector,
int32_t count,
off_t offset, uint32_t flags,
struct iobref *iobref, dict_t *xdata)
{
rot_13_private_t *priv = (rot_13_private_t *)this->private;
if (priv->encrypt_write)
rot13_iovec (vector, count);

STACK_WIND (frame,
rot13_writev_cbk,
FIRST_CHILD (this),
FIRST_CHILD (this)->fops->writev,
fd, vector, count, offset, flags,
iobref, xdata);
return 0;
}

rot13_writev是文件内容写入的函数指针,rot13_writev_cbk则是对应的callback

看到在rot13_writev函数中,调用宏STACK_WIND的时候,需要制定callback,当下一个translator同样的文件操作完成以后,callback就能被调用.在rot13_writev_cbk中,调用了STACK_UNWIND_STRICT这个宏来调用上层translator的callback.

在gluster源码中的xlators\cluster中的三个translator应该是我们研究的重点,尤其对于分布式文件系统来说,最重要的就是afr,即automatic file replication,自动文件复制.

通过阅读afr的源码可以看出,gluster的副本机制没有采用主从模型,而是所有节点都是主节点.在一次文件写入时,要调用afr的所有subvolume,而且要等待所有subvolume的回调.

推荐几篇好文章

[url]http://hekafs.org/index.php/2011/11/translator-101-class-1-setting-the-stage/[/url]

[url]http://hekafs.org/index.php/2011/11/translator-101-lesson-2-init-fini-and-private-context/[/url]

[url]http://hekafs.org/index.php/2011/11/translator-101-lesson-3-this-time-for-real/[/url]

[url]http://hekafs.org/index.php/2011/11/translator-101-lesson-4-debugging-a-translator/[/url]

让你更加深入了解gluster代码结构,还能自己构造translator,用GDB运行时debug gluster

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234267.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • nginx启动停止命令[通俗易懂]

    nginx常用命令启动停止:先进入nginx目录,再进入子目录sbinnginx启动:./nginxnginx停止:./nginx-sstopnginx重新加载nginx.conf:./nginx-sreloadnginx查看nginx.conf配置是否正确:./nginx-t修改配置:先进入nginx目录,再进入子目录conf修改nginx.conf文件…

    2022年4月13日
    197
  • Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!「建议收藏」

    转载自Git使用教程预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料)一:Git是什么?Git是目前世界上最先进的分布式版本控制系统。工作原理/流程:Workspace:工作区Index/Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库二:SVN与Git的最主要的区别?SVN是集中式版本控制系统,版本库是集中放在中央…

    2022年4月6日
    42
  • 安装hiredis

    安装hiredis下载地址 https github com redis hiredis 文件解压之后进入文件夹直接执行 make 然后在执行 makeinstall 即可安装

    2025年8月23日
    0
  • MySQL集群手册

    MySQL集群手册1 nbsp 集群与普通 MySQL 服务器区别 nbsp nbsp nbsp nbsp 与没有使用集群的 MySQL 相比 在 MySQL 集群内操作数据的方式没有太大的区别 执行这类操作时应记住两点 nbsp nbsp nbsp nbsp nbsp 1 表必须用 ENGINE NDB 或 ENGINE NDBCLUSTER 选项创建 或用 ALTER nbsp TABLE 选项更改 以使用 NDB 集群存储引擎在集群内复制它们 如果使用 mysqldump 的输出从已有数据库导入表 可在文本编

    2025年6月2日
    2
  • Centos Go环境搭建「建议收藏」

    Centos Go环境搭建「建议收藏」标准官网:https://golang.org/需要墙镜像官网:https://golang.google.cn/dl/【国内推荐】1、下载文件wgethttps://golang.google.cn/dl/go1.14.7.linux-amd64.tar.gz2、解压文件到/usr/local如果之前已经安装过go的版本,先清空下go下面src,不然可能会报一些previousdeclarationat/usr/local/go/src/runtime/internal/atom

    2022年10月12日
    3
  • 根文件系统使用登录模式「建议收藏」

    根文件系统使用登录模式

    2022年1月30日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号