接口名称
| 接口下层函数
| 功能
|
smgr_init
| mdinit
| 初始化一些系统需要的状态等,调用关系如下:
smgrinit
BaseInit
AutoVacLauncherMain
AutoVacWorkerMain
AuxiliaryProcessMain
PostgresMain
从上面的调用关系可以看出,系启动的过程中,完成初始化的工作
|
smgr_create
| mdcreate
| 创建一个“relation”(注意PG中,此处的“relation”指的是一个表的数据,而对象的定义,诸如视图、序列等,都是存储对的定义在系统表pg_class中,没有外存可见的文件存在)
smgrcreate
fsm_extend
RelationCreateStorage
smgr_redo
ATExecSetTableSpace
vm_extend
XLogReadBufferExtended
从上面的调用关系可以看出,新建、扩展、日志重做等操作会调用到创建relation。
|
smgr_read
| mdread
| 从指定的“relation”中读出指定块的数据到“数据缓冲区”,物理读操作。
smgrread
ReadBuffer_common
ReadBufferExtended
ReadBufferWithoutRelcache
copy_relation_data
从上面的调用关系可以看出,物理读操作,只与数据缓冲区打交道
|
smgr_prefetch
| mdprefetch
| 从外存上预先读入数据到数据缓冲区。
f_smgr.smgr_prefetch
f_smgr
smgrprefetch
PrefetchBuffer
BitmapHeapNext
ExecBitmapHeapScan
ExecProcNode
LocalPrefetchBuffer
PrefetchBuffer
从上面的调用关系可以看出,预取功能是为bitmap扫描做的。除此外,本函数是为异步IO做的,但实际上PG还是采用的同步IO函数实现的本函数,
|
smgr_write
| mdwrite
| 物理写操作,把数据缓冲区中的信息,刷出到外存
f_smgr.smgr_write
f_smgr
smgrwrite
FlushBuffer
FlushRelationBuffers
LocalBufferAlloc
_bt_blwritepage
从上面的调用关系可以看出,物理写操作,都是与数据缓存区层打交道。
|
smgr_nblocks
| mdnblocks
| 计算一个“relation”所使用的块(8k一个块)的个数
|
smgr_extend
| mdextend
| 一个“relation”空间不够的时候,自动扩展文件大小
|
smgr_truncate
| mdtruncate
| 对一个“relation”空间做截断操作
|
smgr_immedsync
| mdimmedsync
| 刷出一个“relation”的内容到外存
|
smgr_pre_ckpt
| mdpreckpt
| 做checkpoint之前,预先做一些操作
|
smgr_sync
| mdsync
| 同步刷出数据到外存。(恢复过程中使用,暂不研究)
|
smgr_post_ckpt
| mdpostckpt
| 做checkpoint之后,收尾做一些操作(删除一些在事务没有完成前不能删除的文件)
|
smgr_exists
| mdexists
| 判断外存文件是否存在
|
smgr_unlink
| mdunlink
| 删除一个外存文件(一个“relation”)
|
smgr_close
| mdclose
| 关闭一个外存文件(一个“relation”)
|
smgr_shutdown
| NULL
| 系统关闭时,存储系统是否需要做些收尾工作,如果需要,可以置于此
|
以上函数,init可以对应shutdown,open对应close,read对应write,create对应unlink,其他操作,是一些辅助类型的操作,但是必要。如,计算块的个数、文件扩展、截断、文件是否存在等等。注意,理解这些操作,就能理解一个接口层,抽象后,可以支持哪些操作了。