
mdextend
v = _mdfd_getseg
根据传入的页号看该页位于的段号targetseg
reln->md_num_open_segs[forknum]是该文件打开的段文件个数
seekpos:根据传入的blocknum计算出偏移
FileWrite根据偏移写入buffer的数据(一页)
targetseg小于打开的段文件个数即该段文件已打开,则返回该文件的MfdVec
文件没打开,则从最近打开的文件开始依次打开
BlockNumber nblocks = _mdnblocks(reln, forknum, v);
if ((behavior & EXTENSION_CREATE) ||
(InRecovery && (behavior & EXTENSION_CREATE_RECOVERY)))
此时页数不满一个段, mdextend扩展最后一页
flags = O_CREAT;
lseek(VfdCache[file].fd, 0, SEEK_END);
v = _mdfd_openseg(reln, forknum, nextsegno, flags);
nextseg为下一个打开的段,若不存在则O_CREATE在open的时候创建新文件
smgrextend
ReadBuffer_common
fsm_extend
isExtend = (blockNum == P_NEW);
if (isExtend)
blockNum = smgrnblocks(smgr, forkNum);
MemSet((char *) bufBlock, 0, BLCKSZ);
smgrextend(smgr, forkNum, blockNum, (char *) bufBlock, false);
smgrread(smgr, forkNum, blockNum, (char *) bufBlock);
_hash_alloc_buckets
_bt_blwritepage
end_heap_rewrite
raw_heap_insert
RelationCopyStorage
vm_extend
评论