PostgreSQL中的BufferAlloc源码解析

  1. 首先从SharedBufHash查找buffer,如果找到了,看是否是有效buffer,如果无效,可能是有其他进程正在读取这个buffer,这时需要等待其他进程对这个buffer的IO访问结束,如果没结束,foundPtr置位false,然后返回buffer
  2. SharedBufHash中没有找到,则选择一个victim buffer。

  2.1 调用StrategyGetBuffer函数找到一个victim

  2.2 pin住这个buffer

  2.3 如果buffer为脏,如果strategy不为NULL,并且buffer的wal已经落盘,并且buffer并不是strategy指定的buffer,则continue,寻找下一个victim buffer

  2.4 buffer落盘

  2.5 获取LW_EXCLUSIVE锁

  2.6 将buffer插入到SharedBufHash

  2.7 如果buffer引用计数为1,并且不是BM_DIRTY,则退出循环

3、程序走到这里,算是找到了buffer,清理buf_state的旧状态,赋值新状态BM_TAG_VALID | BUF_USAGECOUNT_ON,初始化buffer中的其他成员。

4、将旧的buffer从SharedBufHash中删除

5、再次调用StartBufferIO,如果有其他进程正在读这个buffer,则foundPtr为false,否则为true。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值