现将前段时间分析的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子卷,才算加锁成功,否则会解除之前加成功的锁;
8、分布式删除文件夹
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,不管删除成功或失败均返回给客户端,只是返回的状态不一样;