基本概念
PG Lock:
为了确保操作PG元数据的原子性。
RW Lock:
用于对象之间的互斥,互斥规则如下:
读 | 写 | |
---|---|---|
读 | 不互斥(在PG lock中) | 互斥 |
写 | 互斥 | 不互斥(由存储引擎来保序与互斥) |
详细介绍
读流程
读请求:一直持有读锁
由于读流程是同步的,因此整个流程都会持有PG Lock和Read Lock,同步读到数据后,释放Read Lock后,再释放PG Lock。
写流程
写请求:主从副本全部提交到存储引擎后才释放写锁
写流程先加PG Lock,后加Write Lock。
把事务提交到本地存储引擎之后,就释放了PG Lock。
对于三副本而言,等主副本和从副本都异步提交到存储引擎后,回调流程会去释放写锁。
对于同一个对象,如果加锁失败如何处理:
与普通锁不同,加不到锁会一直等待,而对象的读写锁如果加不到直接会返回false,直接调用close_op_ctx(ctx),该函数中,会让op重新入队,等待调度。
写流程PG Lock的生命周期
参考笔者文章:osd shard queue
写锁何时释放
参考笔者文章:ceph osd 写流程回调梳理