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

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

内容简介:如下就是将一个记录存储到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。

回到概述页


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

查看所有标签

猜你喜欢:

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

Programming Collective Intelligence

Programming Collective Intelligence

Toby Segaran / O'Reilly Media / 2007-8-26 / USD 39.99

Want to tap the power behind search rankings, product recommendations, social bookmarking, and online matchmaking? This fascinating book demonstrates how you can build Web 2.0 applications to mine the......一起来看看 《Programming Collective Intelligence》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具