This commit is contained in:
Cachuela 2023-10-05 22:40:46 +08:00
parent 1a3b0e6c56
commit 679db10bf3
1 changed files with 47 additions and 9 deletions

View File

@ -47,77 +47,115 @@ static Block GetLocalBufferStorage(void);
* Do PrefetchBuffer's work for temporary relations.
* No-op if prefetching isn't compiled in.
*/
/*
访
访
*/
void LocalPrefetchBuffer(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum)
{
#ifdef USE_PREFETCH
BufferTag new_tag; /* identity of requested block */
BufferTag new_tag; /* 请求块的标识 */
LocalBufferLookupEnt *hresult = NULL;
// 初始化请求块的标识
INIT_BUFFERTAG(new_tag, smgr->smgr_rnode.node, forkNum, blockNum);
/* Initialize local buffers if first request in this session */
// 如果在当前会话中首次请求本地缓冲区,初始化本地缓冲区
if (u_sess->storage_cxt.LocalBufHash == NULL)
InitLocalBuffers();
/* See if the desired buffer already exists */
// 查看所需的缓冲区是否已经存在
hresult = (LocalBufferLookupEnt*)hash_search(u_sess->storage_cxt.LocalBufHash, (void*)&new_tag, HASH_FIND, NULL);
if (hresult != NULL) {
/* Yes, so nothing to do */
/* 是的,所以不需要进行预取操作 */
return;
}
/* Not in buffers, so initiate prefetch */
// 如果缓冲区中不存在所需块,启动预取操作
smgrprefetch(smgr, forkNum, blockNum);
#endif /* USE_PREFETCH */
}
/*
SMgrRelation
smgrwrite fork
*/
void LocalBufferWrite(BufferDesc *bufHdr)
{
SMgrRelation oreln;
Page localpage = (char *)LocalBufHdrGetBlock(bufHdr);
char *bufToWrite = NULL;
/* Find smgr relation for buffer */
/* 查找缓冲区对应的SMgrRelation */
oreln = smgropen(bufHdr->tag.rnode, BackendIdForTempRelations);
/* data encrypt */
/* 对缓冲区中的数据进行加密data encrypt */
bufToWrite = PageDataEncryptForBuffer(localpage, bufHdr);
/* 计算并设置数据页的校验和 */
PageSetChecksumInplace((Page)bufToWrite, bufHdr->tag.blockNum);
/* And write... */
/* 将数据写入磁盘 */
smgrwrite(oreln, bufHdr->tag.forkNum, bufHdr->tag.blockNum, bufToWrite, false);
}
void LocalBufferFlushForExtremRTO(BufferDesc *bufHdr)
{
if (dw_enabled()) {
/* double write */
/* 如果启用了双写double write机制执行相应的操作 */
/* 双写是一种数据持久性保护机制,确保数据写入磁盘的安全性 */
/* 在此处可能包括双写操作的代码 */
}
/* 调用 FlushBuffer 函数将本地缓冲区刷新到磁盘 */
/* WITH_LOCAL_CACHE 参数表示使用本地缓存 */
FlushBuffer(bufHdr, NULL, WITH_LOCAL_CACHE);
}
/*
LocalBufferFlushForExtremRTO
*/
void LocalBufferFlushAllBuffer()
{
int i;
// 遍历所有本地缓冲区
for (i = 0; i < u_sess->storage_cxt.NLocBuffer; i++) {
BufferDesc *bufHdr = &u_sess->storage_cxt.LocalBufferDescriptors[i];
uint32 buf_state;
// 读取缓冲区状态
buf_state = pg_atomic_read_u32(&bufHdr->state);
// 确保本地引用计数为0表示没有任何进程正在使用该缓冲区
Assert(u_sess->storage_cxt.LocalRefCount[i] == 0);
// 如果缓冲区是有效的且脏的
if ((buf_state & BM_VALID) && (buf_state & BM_DIRTY)) {
// 调用 LocalBufferFlushForExtremRTO 函数刷新缓冲区到磁盘
LocalBufferFlushForExtremRTO(bufHdr);
// 清除缓冲区的脏标志
buf_state &= ~BM_DIRTY;
pg_atomic_write_u32(&bufHdr->state, buf_state);
// 更新本地缓冲区写入计数
u_sess->instr_cxt.pg_buffer_usage->local_blks_written++;
}
}
}
static void LocalBufferSanityCheck(BufferTag tag1, BufferTag tag2)
{
if (!BUFFERTAGS_EQUAL(tag1, tag2)) {