博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
postgres预写式日志的内核实现详解-wal记录写入
阅读量:6823 次
发布时间:2019-06-26

本文共 2741 字,大约阅读时间需要 9 分钟。

hot3.png

   导读:

 

如下就是将一个记录存储到wal日志文件的主要函数,本文主要是对这些函数进行逐一说明。

XLogBeginInsert();
XLogRegisterData();
XLogRegisterBuffer();
XLogRegisterBufData();
XLogSetRecordFlags(); 
XLogInsert();
  XLogRecordAssemble();
  XLogInsertRecord();
PageSetLSN   

一、重要数据结构

typedef struct XLogRecData{	struct XLogRecData *next;	/* next struct in chain, or NULL */	char	   *data;			/* start of rmgr data to include */	uint32		len;			/* length of rmgr data to include */} XLogRecData;typedef struct{	bool		in_use;			/* is this slot in use? */	uint8		flags;			/* REGBUF_* flags */	RelFileNode rnode;			/* identifies the relation and block */	ForkNumber	forkno;	BlockNumber block;	Page		page;			/* page content */	uint32		rdata_len;		/* total length of data in rdata chain */	XLogRecData *rdata_head;	/* head of the chain of data registered with								 * this block */	XLogRecData *rdata_tail;	/* last entry in the chain, or &rdata_head if								 * empty */	XLogRecData bkp_rdatas[2];	/* temporary rdatas used to hold references to								 * backup block data in XLogRecordAssemble() */	/* buffer to store a compressed version of backup block image */	char		compressed_page[PGLZ_MAX_BLCKSZ];} registered_buffer;

二、重要全局变量

static XLogRecData *mainrdata_head;static XLogRecData *mainrdata_last = (XLogRecData *) &mainrdata_head;/*使用XLogRegisterBuffer注册的数据存储到registered_buffers数组里*/static registered_buffer *registered_buffers;/*使用XLogRegisterBufData注册的数据存储到rdatas数组里,并链接为链表,使用registered_buffer结构里的rdata_head和rdata_tail作为链表的首尾。*//*使用XLogRegisterData注册的数据存储到rdatas数组里,并使用mainrdata_head和mainrdata_lastata注册的数据存储到rdatas数组里,并链接为链表,使用registered_buffer结构里的rdata_head和rdata_tail作为链表的首尾。*/static XLogRecData *rdatas;

 

三、函数说明

1.XLogBeginInsert()

作用:判断当前是否可以执行xlog插入,标志wal插入开始。

 

2.XLogRegisterData()

作用:

①将本条wal记录的特殊结构体数据注册到wal记录,比如XLOG_HEAP_INSERT子类型的xl_heap_insert结构体。

②将一些旧元组数据注册到wal记录,比如执行update语句的旧元组数据、delete语句的旧元组数据。

实现过程:

找到rdatas数组中第一个空的的位置,将传入的参数赋值给这个空位置

e1404a99aee10f11128b910316cce856f49.jpg

3.XLogRegisterBuffer():

作用:

将涉及到的buff注册到wal记录,比如insert语句的目标buff、update语句的目标buff和源buff。

实现过程:

找到registered_buffer数组中第一个空的的位置,并将这个位置的数据填充

0d198638a51fc5eac274f8971fbd1b4d532.jpg

 

4.XLogRegisterBufData():

作用:

将元组内容注册到wal记录。比如insert语句的元组数据、update语句的新元组数据

实现过程:

在registered_buffer中找到此data的相关buff。

找到rdatas数组中第一个空的的位置,将传入的参数赋值给这个空位置。

将这个位置链接到rdata_tail处

c442d56c60d3fa5cab7aebb9df068c845bc.jpg

5.XLogSetRecordFlags():

作用:

设置origin

 

6.XLogInsert():

作用:

根据当前的数据库状态(full_page_write、checkpoint、REPLICA IDENTITY等),把上述函数注册的数据进行筛选组装,最终形成完整的wal记录并

写入到walbuff。

函数功能主要由XLogRecordAssemble()和XLogInsertRecord()完成

 

7.XLogRecordAssemble()

作用:

代码执行到这个函数的时候,所有的数据已经完成注册,目前wal记录的数据存储在①mainrdata_head②每一个注册的buff的rdata_head③每一个注册的buff的page字段中

这个函数就是要①②③中的数据组合到一起的过程。

实现过程:

过程太复杂,画一组图来说明一下。

 

9270f96499a20a04c3863920063e0c17f71.jpg

 

a58dbe1fc6e86fe89d0ef783af97a2ecfce.jpg

6a2103bc722832747dde283466d2c5d7778.jpg

f1b6a7fb7a967ba8315d01c910e5c05492d.jpg

 

d52353fbdfcfb7099279b5f2cb41b9d6e36.jpg

 

8.XLogInsertRecord

作用:

此函数就是将XLogRecordAssemble()函数返回的hdr_rdt依次写到wal的内存中。

9.PageSetLSN();

作用:

更新被修改的page LSN。

 

转载于:https://my.oschina.net/lcc1990/blog/2962965

你可能感兴趣的文章
作业八
查看>>
thinkphp总体设计
查看>>
使用 Button 类在 XNA 中创建图形按钮(九)
查看>>
Different Integers 牛客网暑期ACM多校训练营(第一场) J 离线+线状数组或者主席树...
查看>>
10.3 定位连续值范围的开始点和结束点
查看>>
js 正则验证数字和小数
查看>>
排列组合的代码总结篇
查看>>
k8s基础
查看>>
[转载] 软件测试相关的63个国外站点
查看>>
C语言实现,十进制与八进制与16进制转换
查看>>
react中label标签的作用
查看>>
[原]Flash研究(一)——本地通讯
查看>>
ionic 向路由中的templateUrl(模板页)传值
查看>>
GPU学习笔记(二)
查看>>
icheck.js的一个简单demo
查看>>
曼哈顿距离的最小生成树
查看>>
安装MongoDB 笔记
查看>>
LeetCode – Refresh – Gray Code
查看>>
web缓存服务器varnish-4.1.6的部署及配置详解
查看>>
Excel VBA 找出选定范围不重复值和重复值
查看>>