postgres预写式日志的内核实现详解-wal记录写入 原 荐

栏目: 数据库 · 发布时间: 6年前

内容简介:如下就是将一个记录存储到wal日志文件的主要函数,本文主要是对这些函数进行逐一说明。XLogBeginInsert();XLogRegisterData();

如下就是将一个记录存储到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数组中第一个空的的位置,将传入的参数赋值给这个空位置

postgres预写式日志的内核实现详解-wal记录写入 原 荐

3.XLogRegisterBuffer():

作用:

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

实现过程:

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

postgres预写式日志的内核实现详解-wal记录写入 原 荐

4.XLogRegisterBufData():

作用:

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

实现过程:

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

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

将这个位置链接到rdata_tail处

postgres预写式日志的内核实现详解-wal记录写入 原 荐

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字段中

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

实现过程:

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

postgres预写式日志的内核实现详解-wal记录写入 原 荐

postgres预写式日志的内核实现详解-wal记录写入 原 荐

postgres预写式日志的内核实现详解-wal记录写入 原 荐

postgres预写式日志的内核实现详解-wal记录写入 原 荐

postgres预写式日志的内核实现详解-wal记录写入 原 荐

8.XLogInsertRecord

作用:

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

9.PageSetLSN();

作用:

更新被修改的page LSN。

回到概述页


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

AI极简经济学

AI极简经济学

阿杰伊·阿格拉沃尔、乔舒亚·甘斯、阿维·戈德法布 / 闾佳 / 湖南科技出版社 / 2018-12-1 / 58.00

人工智能正在以不可阻挡的态势席卷全球。无论是iPhone的神经网络引擎、AlphaGo的围棋算法,还是无人驾驶、深度学习……毫无疑问,人工智能正在改写行业形态。如同此前个人电脑、互联网、大数据的风行一般,技术创新又一次极大地改变了我们的工作与生活。 那么,究竟应该如何看待人工智能?在《AI极简经济学》一书中,三位深耕人工智能和决策领域的经济学家给出了清晰的答案。他们以坚实的经济学理论剖析动态,把握......一起来看看 《AI极简经济学》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具