heap_insert产生WAL entry
openGauss-server/include/access/xlogdefs.h
/*
* Pointer to a location in the XLOG. These pointers are 64 bits wide,
* because we don't want them ever to overflow.
*/
typedef uint64 XLogRecPtr;
产生一条RM_HEAP_ID类型的WAL记录。
openGauss-server/gausskernel/storage/access/heap/heapam.cpp
uint8 info = XLOG_HEAP_INSERT;
...
recptr = XLogInsert(RM_HEAP_ID, info, InvalidBktId, istoast);
PageSetLSN(page, recptr);
Page LSN可以保证日志回放的幂等性:
- 如果 记录LSN > 页面LSN:说明这条WAL记录比页面上的修改更新,页面缺少这次更新。因此,恢复进程会执行这条WAL记录中的操作,将数据页更新到最新状态。操作完成后,调用 PageSetLSN 将页面的LSN更新为 记录LSN。
- 如果 记录LSN <= 页面LSN:说明这条WAL记录的修改已经体现在了当前数据页上(可能之前已经重做过了)。此时,恢复进程会安全地跳过这条WAL记录,不做任何操作。