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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • AndroidStudio新建一个flutter工程连接不上设备

    AndroidStudio新建一个flutter工程连接不上设备

    2021年10月1日
    75
  • ping命令的使用及代码_通过命令查看ping路径

    ping命令的使用及代码_通过命令查看ping路径在这个时代,科技越来越发达,网络已经越来越成为人们不可缺少的一部分。计算机也已经是很多学校的课程了,因为计算机技术是非常有技术性的专业,它其中涉及到很多专业知识,需要通过学习才能掌握。今日小编就为大家介绍一个计算机的命令,它叫做Ping,这边介绍一下它的入门知识,主要是关于ping连接和命令方面的介绍。  1、Ping的基础知识  ping命令相信大家已经再熟悉不过了,但是能把ping的功能发…

    2022年4月19日
    801
  • MySQL数据库分区分表配置以及原理、特点、概念、区别详解「建议收藏」

    MySQL数据库分区分表配置以及原理、特点、概念、区别详解「建议收藏」一、为什么要分表和分区?我们的数据库数据越来越大,随之而来的是单个表中数据太多。以至于查询速度变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈。mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。当出现这种情况时,我们可以考虑…

    2022年5月22日
    40
  • 医学图形图像处理(医学影像和医学图像处理)

    文章目录1图像和数字图像1图像和数字图像  数字图像:被定义为一个二维函数,f(x,y),其中x,y代表空间坐标,f代表点(x,y)处的强度或灰度级。和普通的笛卡尔坐标系有区别,在计算机中坐标系左上角为原点:  图像数字化:图像进入计算机后,对图像进行数字化(映射)。数字图像三要素:  (1)像素:大小决定了图像存储、显示的清晰度;  (2)灰度值:通常为0-255,因为在计算机中通常用一个字节来表示一个像素,即28。  (3)坐标  图像存储在计算机中会丢失信息,因为是从一个连续的

    2022年4月15日
    57
  • ThreadPoolTaskExecutor线程池参数配置

    ThreadPoolTaskExecutor线程池参数配置一、线程池配置1、ThreadPoolConfigimportorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.EnableAsync;importorg.springframework.scheduling.concurrent.Threa

    2022年5月4日
    307
  • AD域、Windows AD域管理功能大全「建议收藏」

    AD域、Windows AD域管理功能大全「建议收藏」WindowsAD域管理功能大全,再也不用东拼西凑了!功能一、AD域管理1、AD域管理通过批量创建和编辑用户帐户,指派管理权限等,简化WindowsAD域的管理。2、批量管理域用户使用CSV文件批量导入用户、编辑用户属性、重置密码、批量迁移用户和用户对象。3、批量创建域用户通过导入CSV文件,批量创建用户,包含Exchange邮箱、终端服务等所有属性,指派到组。4、批…

    2022年5月17日
    30

发表回复

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

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