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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • dataframe分割数据_语篇语义框架研究

    dataframe分割数据_语篇语义框架研究mmSegmentation开源语义分割框架详细入门教程,含自定义数据集、模型选择、训练参数设定等

  • 软件测试工作流程概括与总结[通俗易懂]

    软件测试工作流程概括与总结[通俗易懂]最近在为面试新工作做准备,所以想想整理一下软件测试的基本工作流程,大致梳理一遍,这样也便于自己在面试过程中可以沉着的面对面试管的测试工作如何进行的问题。首先,作为测试人员需要学习并了解业务,分析需求点为什么测试人员要参加需求分析?也就是进行测试需求分析的目的是什么?第一、把用户需求转化为功能需求:1)对测试范围进度量2)对处理分支进行度量3)对需求业务的场景进行度量…

  • checkbox选中和不选中 jqu_jquery checkbox 选中不选中

    checkbox选中和不选中 jqu_jquery checkbox 选中不选中展开全部$(function(){//动态绑定默认状态//$(“#ck”).attr(“checked”,true)//选中//$(“#ck”).attr(“checked”,false)//未选中//点击判断选中还是未选中$(“#ck”).click(function(){if($(this).is(“:checked”)){alert(“选中”);}else{alert…

  • 这份算法攻略,我拿到了5个大厂的offer

    这份算法攻略,我拿到了5个大厂的offer

    2020年11月20日
  • 数据库去重操作_数据库数据去重语句

    数据库去重操作_数据库数据去重语句$test_data=M(‘hot’);//实例化数据表$data=$test_data->Distinct(true)->field(‘descriprion’)->order(‘descriptiondesc’)->select();//利用distinct方法去重$data=$test_data->group(‘description’)-…

  • HAVING用法

    HAVING用法1语法:groupby字段having条件判断;groupby的用法我已经在上一篇经验中介绍了2还是已员工绩效表为例3我们如果就是查询每个部门成绩大于89的员工数,可以这样写:SELECTdept,COUNT(user_name)FROMec_usesWHEREscore>89GROUPBYdept;对这个查询的过程进行分析,其实是:先查出绩效成绩大于89的员工记录…

发表回复

您的电子邮箱地址不会被公开。

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