glusterfs分布式,冗余卷读写操作过程

这篇博客详细记录了glusterfs分布式存储中冗余卷的创建和读写操作过程,适合学习和讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现将前段时间分析的glusterfs分布式,冗余部分的部分操作执行过程粘贴出来,供互相学习,欢迎互相探讨

1、冗余卷创建文件

     1)对每个子卷加非阻塞项锁,加锁成功的子卷数等于up子卷,才算加锁成功,否则会解除之前加成功的锁;
     2)如果非阻塞锁失败了,会调用阻塞锁进行加锁;
     3)在所有的up子卷上创建文件,中间可能有创建失败的,所有创建操作完成后将信息返回给父卷,返回的最后一个子卷创建操作返回的op_errno;
     op_ret返回最后一个成功的返回值;
      4)设置xattr中的待定标识;
      5)解锁
注:如果最后一个子卷创建文件失败呢??;创建文件完成后,会返回哪次返回的属性给客户端内核,让内核做相应的决策呢

2、冗余写文件
      1)对每个子卷加非阻塞inde锁,加锁成功的子卷数等于up子卷,才算加锁成功,否则会解除之前加成功的锁;
      2)如果非阻塞锁失败了,会调用阻塞锁进行加锁;
      3)在所有up子卷上写文件,中间可能有写失败的文件,op_ret返回第一个返回成功的子卷;prebuf,postbuf返回read_child对应的信息;op_errno返回最后一个子卷写返回的错误信息
      4)设置xattr中的待定标识;
      5)解锁

3、冗余创建文件夹(afr_mkdir)
      1)对每个子卷加非阻塞项锁,加锁成功的子卷数等于up子卷,才算加锁成功,否则会解除之前加成功的锁;
      2)如果非阻塞锁失败了,会调用阻塞锁进行加锁;
      3)在所有up子卷上创建文件夹,中间可能有创建失败的文件夹,op_errno返回最后一个子卷写返回的错误信息
      4)设置xattr中的待定标识;
      5)解锁
4、冗余删除文件夹
     1)对每个子卷加非阻塞项锁,加锁成功的子卷数等于up子卷,才算加锁成功,否则会解除之前加成功的锁;
     2)如果非阻塞锁失败了,会调用阻塞锁进行加锁;
     3)对所有up子卷发送删除文件夹的操作,中间可能有删除文件夹失败的操作,op_ret为第一个删除成功返回的op_ret;preparent,postparent为read_child节点返回的参数;op_errno为最后一次rmdir操作的返回值,可能为成功,也可能为失败
     4)设置父目录xattr中的待定标识
     5)解锁

5、冗余删除文件(afr_unlink)
     1)对每个子卷加非阻塞项锁,加锁成功的子卷数等于up子卷,才算加锁成功,否则会解除之前加成功的锁;
     2)如果非阻塞锁失败了,会调用阻塞锁进行加锁;
     3)对所有up子卷发送删除文件夹的操作,中间可能有删除文件夹失败的操作,op_ret为第一个删除成功返回的op_ret;preparent,postparent为read_child节点返回的参数;op_errno为最后一次rmdir操作的返回值,可能为成功,也可能为失败;
     4)设置父目录xattr中的待定标识;
     5)解锁

6、分布式文件夹创建(dht_mkdir)
      在hashbrick上创建文件夹test,并创建成功;
      再在其他brick上创建文件夹test,没有强制确保是否一定成功,最后一次创建文件夹test返回的错误会返回给客户端;
      为每个brick对应的test分配区间,存储到layout中;
      为每个brick上的test设置xattr,扩展属性如果并没有完全正常修复,并不会报错;

7、分布式创建文件过程(dht_create)
      1)在hash卷上创建文件test;
      2)返回如果成功,设置inode的layout;
      3)不管正常错误,均向客户端返回;

8、分布式删除文件夹
      1)对所有的子卷发起opendir操作,如果操作失败,不再对该卷子卷执行readdirp操作;如果opendir操作成功,再执行readdirp操作;
      2)执行readdirp后,如果对应目录项下有除链接与".",".."外,没有其他项,则会调用lookup查询该链接是否为一个链接(没有意外均是),如果是则删除该链接;
      3)所有子卷执行readdirp完毕后,所有子卷执行rmdir操作,执行rmdir操作前先检查local->op_ret == -1即只要有几个brick返回失败,则rmdir将不再执行而是直接返回错误信息给客户端;
      4)每个brick执行rmdir操作时,如果某个子卷返回op_errno != ENOENT && op_errno != EACCES,则当所有子卷rmdir操作返回后,会对该目录项进行修复操作(注:只能修复目录及其相关属性),本次删除操作失败,否则所有子卷rmdir操作后,直接返回客户端;


9、分布式删除文件(dht_unlink)
     1)获得文件的hash卷hashed_subvol,和缓存卷cached_subvol;
     2)如果hashed_subvol不等于cached_subvol,则先删除hashed_subvol上的文件,如果删除失败,则直接返回客户端;如果删除成功,则在cached_subvol上调用删除(unlink),不管删除成功或失败均返回给客户端,只是返回的状态不一样;
     3如果hashed_subvol等于cached_subvol,不管删除成功或失败均返回给客户端,只是返回的状态不一样;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值