【ceph】cephfs的锁 笔记

本文详细介绍了Ceph MDS(Metadata Server)的锁机制,包括CEPH caps的概念、锁的作用、获取与释放过程,以及不同类型的锁如rdlock、wrlock和xlock。锁的实现旨在保护元数据一致性,确保多客户端并发访问的安全。MDS通过状态机管理锁的状态转换,以实现精确的caps分配。
摘要由CSDN通过智能技术生成

目录

CEPH MDS锁实现介绍

锁的作用

锁的获取

加锁类型

锁的种类和状态机

锁的状态转换

锁的释放

了解cephfs锁必须要知道的事情


CEPH caps简介

http://t.csdn.cn/7tY3w

CAPS 和锁的关系

caps由mds进行管理,其将元数据划分为多个部分,每个部分都有专门的锁(SimpleLock、ScatterLock、FileLock)来保护,mds通过这些锁的状态来确定caps可以怎么样分配。

mds内部维护了每个锁的状态机,其内容非常复杂,也是mds保证caps分配准确性和数据一致性的关键。

CEPH MDS锁实现介绍

锁的作用

MDS中的锁是为了保护log的正常写入。每次对目录树进行操作前,需要先将目标path中涉及的节点加锁,在内存中修改完目录树(修改方式类似于RCU,即生成一个新节点,push_back到 队列 中)后,将新的目录树信息(只是此条path,不是整个目录树)记录到MDS的journal对象中,journal对象落盘后再将 队列 中的节点pop_front出来,至此,内存中的目录树已经能反映出之前的修改,加的锁也在此时开始释放,最后当前目录树的信息更新到meta pool的dir对象中。

锁的获取

加锁类型

加锁的类型分三类:rdlock(读)、wrlock(写)、xlock(互斥)。每次对目录树进行操作前都要将path上的节点进行适当地加锁。可从src/mds/Server.cc中观察这一操作:

handle_client_xxx
      |-- rdlock_path_xlock_dentry或rdlock_path_pin_ref
      |-- mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks)

对于一个路径进行操作时,最后一个dentry之前的dentry都要加rdlock,避免别人进行修改。xlock用于创建或者修改节点时,比如mkdir时需要对新的dentry加xlock,创建新文件时需要对CInode::linklock(负责inode的nlink属性)加xlock。rdlock和xlock符合通常认知:共享读,互斥写。

wrlock比较特殊,主要用在CInode::filelockCInode::nestlock上,前者负责保护当前目录的统计信息inode_t::dirstat,后者负责保护当前目录的递归统计信息inode_t::rstat

由于一个目录可以分成多个分片,甚至同一个分片也可以有多个副本分散于各个mds,为了允许对这些分片的统计信息同时进行修改,引入了wrlock,这些分散的被修改的信息将在后续的一个时间点上进行综合,最终传播到目录树的inode信息中(见CInode::preditry_journal_parents)。对于CInode::versionlockCDentry::versionlock也会加wrlock锁,但由于是locallock sm,意义和simplelock的xlock一样,只是为了互斥写。

锁的种类和状态机

一个inode中的信息有很多种,每种由不同的锁来保护,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值