ceph RWLock源码分析

ceph RWLock源码分析

源文件:
src/commom/RWLock.h

读写锁

class RWLock {
主要数据成员:
	pthread_rwlock_t L: pthread库中的读写锁
	string name: 读写锁的名称
	atomic nrlock, nwlock: 读锁和写锁的引用计数

主要成员函数:
	RWLock():
		读写锁的构造函数会根据输入的参数设置读写锁的属性,主要是防止长时间的读造成写的饿死情况.
	is_locked():
	is_wlocked():
	is_rlocked():
		判断锁的状态.
	unlock():
		读锁和写锁的解锁都基于它进行解锁操作
	get_read():
	put_read():
	try_get_read():
		读锁的lock, unlock和try_lock
	get_write():
	put_write():
	try_get_write():
		写锁的lock,unlock和try_lock
	get(bool):
		参数为true,写锁加锁,否则读锁加锁
}

读锁

class RLocker {
	构造函数加锁,析构函数解锁,主要用于语句块中
}

写锁

class WLocker {
	构造函数加锁,析构函数解锁,主要用于语句块中
}

Context

Context和RWLock基本相同,只不过多了一个写锁强占读锁的函数.

class Context {
	void promote(): 读锁可以被写锁强占.
}
Ceph中,stripe是一种将数据分片存储的概念。当进行文件读取操作时,需要通过一系列的计算来确定数据所在的具体位置。本文以CephFS的文件读取流程为例进行分析。 首先,在文件读取过程中,Ceph会将文件划分为若干个条带(stripe),每个条带由多个对象分片(stripe unit)组成。条带可以看作是逻辑上连续的一维地址空间。 接下来,通过file_to_extent函数将一维坐标转化为三维坐标(objectset,stripeno,stripepos),来确定具体的位置。其中,objectset表示所在的对象集,stripeno表示条带号,stripepos表示条带内的偏移位置。 具体的计算过程如下:假设需要读取的数据的偏移量为offset,每个对象分片的大小为su(stripe unit),每个条带中包含的对象分片数为stripe_count。 首先,计算块号blockno = offset / su,表示数据所在的分片号。 然后,计算条带号stripeno = blockno / stripe_count,表示数据所在的条带号。 接着,计算条带内偏移stripepos = blockno % stripe_count,表示数据在条带内的偏移位置。 接下来,计算对象集号objectsetno = stripeno / stripes_per_object,表示数据所在的对象集号。 最后,计算对象号objectno = objectsetno * stripe_count + stripepos,表示数据所在的对象号。 通过以上计算,可以确定数据在Ceph中的具体位置,从而完成文件读取操作。 需要注意的是,以上分析是基于Ceph版本10.2.2(jewel)进行的,尽管版本跨度较大,但是该部分代码在12.2.10(luminous)版本中仍然比较稳定,基本的框架没有发生变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值