Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two

  一致性读请求  

ktrget请求调用流程,调用kcbgtcr获取最佳缓存区域用以构建CR缓冲区,然后调用ktrgcm应用undo构建可用的CR缓存。kcbgtcr计算扫描hash桶,调用ktrexf查找最佳缓存区。如果在缓存区域在本地则结束,如果不在本地则调用kcbzib获得缓存区域。kcbzib请求调用kcbzgb获得一个buffer并且设置buffer的状态为Reading。

ktrgcm统计信息递增条件:

  • 如果应用UNDO并且CLEANOUT,则“cleanouts and rollbacks - consistent read”计数增加。

  • 如果应用UNDO但是没有执行CLEANOUT,则“rollbacks -consistent read”计数增加。

  • 如果没有应用UNDO但执行CLEANOUT,则“cleanouts- consistentread”计数增加。

  • 如果没有应用UNDO并且也没有执行CLEANOUT,则“no work - consistentread”计数增加。

注:这里的cleanout指的是Oracle延迟块清除。

Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two

Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two

注:如果LE转换期间发生超时,则设置KCBBHFCR标志位。如果DLM转换成功,则LE模式> =请求模式。 


Oracle根据LE持有模式与CR请求模式的兼容性关系决定调用kclcls是否需要打开LE(第一次使用)或进行转换LE,即lock open,lock convert。

Oracle通过acquiring !=0或者releasing !=0来判断LE是否处于事务中。

Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two

在kclscrs流程中,它根据三个判断来确定接下来执行的请求动作(lock open,lock convert,predecessor read)。

从下面流程图中我们知道只有当buffer上存在全局的锁,锁元素为open状态并且缓存中没有任何PI,那么这个时候系统就会调用kjbpredread进行predecessor read(LWR)进行当前块的请求动作记录等待事件“global cache current blocks xxxx”。lock open,lock convert均为一致性块构造的过程所以记录的等待为“global cache CRblocks xxxx”。

Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two

Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two


  请求消息传递  

1.前台进程申请LE。

2.设置LE请求标识0x2。

3.前台进程向master节点的lms进程提交请求信息。

4.前台进程开始等待“global cache CR request”。

5.master节点的LMS进程通知请求节点LMS进程已完成锁授权。

6.LMS申请取消标识0x2。

7.本地LMS进程通知前台进程,前台进程结束等待。


  请求块传递  

1.前台进程申请LE。

2.设置LE请求标识0x2。

3.前台进程向master节点的lms进程提交请求信息。

4.前台进程开始等待“global cache CR request”。

5.master节点LMS申请请求创建CR块。

6.master节点LMS进程直接将CR块传递给请求实例的前台进程。

Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two


如果轻量级工作规则LWR在CR块正在构建时触发,则X$KCLCRST.LIGHTn会递增,触发条件:

  • 找到具有相同AFN和BLOCKNUM的缓冲区,但缓冲区中的object-id与请求者提交的object-id不同(在一致读取<is>开始之后和结束之前,对象被truncate或drop)。

  • 等待WRITE COMPLETE。

  • 等缓冲区处于READING状态。

  • 请求空闲缓冲区。

  • 等待“free buffer wait”。

  • 从磁盘到缓冲区缓存的读取块。

  • 等待REDO空间。

  • 等待ITL。

如果找到具有“modification starte”位的块,则X$KCLCRST.LIGHT1递增; 如果缓冲区处于实例RECOVERY状态,则X$KCLCRST.LIGHT2递增。

Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two

Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two

  kclgcr  

将CR缓冲区发送给请求者后,将更新以下统计信息:

  • “global cache cr block build time”,记录在ktrget或kcbgtcr中花费时间。

  • “global cache cr block log flush time”,记录在LOG FLUSH阶段花费时间。

  • “global cache cr block send time”,记录CR块发送花费的时间。

注意:每次缓冲区修改时都会重置LE.FAIRNESS_COUNTER。

Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two

Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two