内容简介:如下就是将一个记录存储到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数组中第一个空的的位置,将传入的参数赋值给这个空位置
3.XLogRegisterBuffer():
作用:
将涉及到的buff注册到wal记录,比如insert语句的目标buff、update语句的目标buff和源buff。
实现过程:
找到registered_buffer数组中第一个空的的位置,并将这个位置的数据填充
4.XLogRegisterBufData():
作用:
将元组内容注册到wal记录。比如insert语句的元组数据、update语句的新元组数据
实现过程:
在registered_buffer中找到此data的相关buff。
找到rdatas数组中第一个空的的位置,将传入的参数赋值给这个空位置。
将这个位置链接到rdata_tail处
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字段中
这个函数就是要①②③中的数据组合到一起的过程。
实现过程:
过程太复杂,画一组图来说明一下。
8.XLogInsertRecord
作用:
此函数就是将XLogRecordAssemble()函数返回的hdr_rdt依次写到wal的内存中。
9.PageSetLSN();
作用:
更新被修改的page LSN。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- R0Ak:一款针对Windows 10的内核模式代码读取、写入和执行的测试工具
- 优化ElasticSearch写入效率
- golang 创建,读取,写入文件
- Kafka学习笔记 -- 写入数据
- Elasticsearch 写入原理深入详解
- 高频写入redis场景优化
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入浅出强化学习:原理入门
郭宪、方勇纯 / 电子工业出版社 / 2018-1 / 79
《深入浅出强化学习:原理入门》用通俗易懂的语言深入浅出地介绍了强化学习的基本原理,覆盖了传统的强化学习基本方法和当前炙手可热的深度强化学习方法。开篇从最基本的马尔科夫决策过程入手,将强化学习问题纳入到严谨的数学框架中,接着阐述了解决此类问题最基本的方法——动态规划方法,并从中总结出解决强化学习问题的基本思路:交互迭代策略评估和策略改善。基于这个思路,分别介绍了基于值函数的强化学习方法和基于直接策略......一起来看看 《深入浅出强化学习:原理入门》 这本书的介绍吧!