- 首先从SharedBufHash查找buffer,如果找到了,看是否是有效buffer,如果无效,可能是有其他进程正在读取这个buffer,这时需要等待其他进程对这个buffer的IO访问结束,如果没结束,foundPtr置位false,然后返回buffer
- 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。