Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
hash_xlog.h270 linesDownload Raw Back to access
1/*-------------------------------------------------------------------------2 *3 * hash_xlog.h4 *	  header file for Postgres hash AM implementation5 *6 *7 * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group8 * Portions Copyright (c) 1994, Regents of the University of California9 *10 * src/include/access/hash_xlog.h11 *12 *-------------------------------------------------------------------------13 */14#ifndef HASH_XLOG_H15#define HASH_XLOG_H16 17#include "access/xlogreader.h"18#include "lib/stringinfo.h"19#include "storage/off.h"20 21/* Number of buffers required for XLOG_HASH_SQUEEZE_PAGE operation */22#define HASH_XLOG_FREE_OVFL_BUFS	623 24/*25 * XLOG records for hash operations26 */27#define XLOG_HASH_INIT_META_PAGE	0x00	/* initialize the meta page */28#define XLOG_HASH_INIT_BITMAP_PAGE	0x10	/* initialize the bitmap page */29#define XLOG_HASH_INSERT		0x20	/* add index tuple without split */30#define XLOG_HASH_ADD_OVFL_PAGE 0x30	/* add overflow page */31#define XLOG_HASH_SPLIT_ALLOCATE_PAGE	0x40	/* allocate new page for split */32#define XLOG_HASH_SPLIT_PAGE	0x50	/* split page */33#define XLOG_HASH_SPLIT_COMPLETE	0x60	/* completion of split operation */34#define XLOG_HASH_MOVE_PAGE_CONTENTS	0x70	/* remove tuples from one page35												 * and add to another page */36#define XLOG_HASH_SQUEEZE_PAGE	0x80	/* add tuples to one of the previous37										 * pages in chain and free the ovfl38										 * page */39#define XLOG_HASH_DELETE		0x90	/* delete index tuples from a page */40#define XLOG_HASH_SPLIT_CLEANUP 0xA0	/* clear split-cleanup flag in primary41										 * bucket page after deleting tuples42										 * that are moved due to split	*/43#define XLOG_HASH_UPDATE_META_PAGE	0xB0	/* update meta page after vacuum */44 45#define XLOG_HASH_VACUUM_ONE_PAGE	0xC0	/* remove dead tuples from index46											 * page */47 48/*49 * xl_hash_split_allocate_page flag values, 8 bits are available.50 */51#define XLH_SPLIT_META_UPDATE_MASKS		(1<<0)52#define XLH_SPLIT_META_UPDATE_SPLITPOINT		(1<<1)53 54/*55 * This is what we need to know about simple (without split) insert.56 *57 * This data record is used for XLOG_HASH_INSERT58 *59 * Backup Blk 0: original page (data contains the inserted tuple)60 * Backup Blk 1: metapage (HashMetaPageData)61 */62typedef struct xl_hash_insert63{64	OffsetNumber offnum;65} xl_hash_insert;66 67#define SizeOfHashInsert	(offsetof(xl_hash_insert, offnum) + sizeof(OffsetNumber))68 69/*70 * This is what we need to know about addition of overflow page.71 *72 * This data record is used for XLOG_HASH_ADD_OVFL_PAGE73 *74 * Backup Blk 0: newly allocated overflow page75 * Backup Blk 1: page before new overflow page in the bucket chain76 * Backup Blk 2: bitmap page77 * Backup Blk 3: new bitmap page78 * Backup Blk 4: metapage79 */80typedef struct xl_hash_add_ovfl_page81{82	uint16		bmsize;83	bool		bmpage_found;84} xl_hash_add_ovfl_page;85 86#define SizeOfHashAddOvflPage	\87	(offsetof(xl_hash_add_ovfl_page, bmpage_found) + sizeof(bool))88 89/*90 * This is what we need to know about allocating a page for split.91 *92 * This data record is used for XLOG_HASH_SPLIT_ALLOCATE_PAGE93 *94 * Backup Blk 0: page for old bucket95 * Backup Blk 1: page for new bucket96 * Backup Blk 2: metapage97 */98typedef struct xl_hash_split_allocate_page99{100	uint32		new_bucket;101	uint16		old_bucket_flag;102	uint16		new_bucket_flag;103	uint8		flags;104} xl_hash_split_allocate_page;105 106#define SizeOfHashSplitAllocPage	\107	(offsetof(xl_hash_split_allocate_page, flags) + sizeof(uint8))108 109/*110 * This is what we need to know about completing the split operation.111 *112 * This data record is used for XLOG_HASH_SPLIT_COMPLETE113 *114 * Backup Blk 0: page for old bucket115 * Backup Blk 1: page for new bucket116 */117typedef struct xl_hash_split_complete118{119	uint16		old_bucket_flag;120	uint16		new_bucket_flag;121} xl_hash_split_complete;122 123#define SizeOfHashSplitComplete \124	(offsetof(xl_hash_split_complete, new_bucket_flag) + sizeof(uint16))125 126/*127 * This is what we need to know about move page contents required during128 * squeeze operation.129 *130 * This data record is used for XLOG_HASH_MOVE_PAGE_CONTENTS131 *132 * Backup Blk 0: bucket page133 * Backup Blk 1: page containing moved tuples134 * Backup Blk 2: page from which tuples will be removed135 */136typedef struct xl_hash_move_page_contents137{138	uint16		ntups;139	bool		is_prim_bucket_same_wrt;	/* true if the page to which140											 * tuples are moved is same as141											 * primary bucket page */142} xl_hash_move_page_contents;143 144#define SizeOfHashMovePageContents	\145	(offsetof(xl_hash_move_page_contents, is_prim_bucket_same_wrt) + sizeof(bool))146 147/*148 * This is what we need to know about the squeeze page operation.149 *150 * This data record is used for XLOG_HASH_SQUEEZE_PAGE151 *152 * Backup Blk 0: page containing tuples moved from freed overflow page153 * Backup Blk 1: freed overflow page154 * Backup Blk 2: page previous to the freed overflow page155 * Backup Blk 3: page next to the freed overflow page156 * Backup Blk 4: bitmap page containing info of freed overflow page157 * Backup Blk 5: meta page158 */159typedef struct xl_hash_squeeze_page160{161	BlockNumber prevblkno;162	BlockNumber nextblkno;163	uint16		ntups;164	bool		is_prim_bucket_same_wrt;	/* true if the page to which165											 * tuples are moved is same as166											 * primary bucket page */167	bool		is_prev_bucket_same_wrt;	/* true if the page to which168											 * tuples are moved is the page169											 * previous to the freed overflow170											 * page */171} xl_hash_squeeze_page;172 173#define SizeOfHashSqueezePage	\174	(offsetof(xl_hash_squeeze_page, is_prev_bucket_same_wrt) + sizeof(bool))175 176/*177 * This is what we need to know about the deletion of index tuples from a page.178 *179 * This data record is used for XLOG_HASH_DELETE180 *181 * Backup Blk 0: primary bucket page182 * Backup Blk 1: page from which tuples are deleted183 */184typedef struct xl_hash_delete185{186	bool		clear_dead_marking; /* true if this operation clears187									 * LH_PAGE_HAS_DEAD_TUPLES flag */188	bool		is_primary_bucket_page; /* true if the operation is for189										 * primary bucket page */190} xl_hash_delete;191 192#define SizeOfHashDelete	(offsetof(xl_hash_delete, is_primary_bucket_page) + sizeof(bool))193 194/*195 * This is what we need for metapage update operation.196 *197 * This data record is used for XLOG_HASH_UPDATE_META_PAGE198 *199 * Backup Blk 0: meta page200 */201typedef struct xl_hash_update_meta_page202{203	double		ntuples;204} xl_hash_update_meta_page;205 206#define SizeOfHashUpdateMetaPage	\207	(offsetof(xl_hash_update_meta_page, ntuples) + sizeof(double))208 209/*210 * This is what we need to initialize metapage.211 *212 * This data record is used for XLOG_HASH_INIT_META_PAGE213 *214 * Backup Blk 0: meta page215 */216typedef struct xl_hash_init_meta_page217{218	double		num_tuples;219	RegProcedure procid;220	uint16		ffactor;221} xl_hash_init_meta_page;222 223#define SizeOfHashInitMetaPage		\224	(offsetof(xl_hash_init_meta_page, ffactor) + sizeof(uint16))225 226/*227 * This is what we need to initialize bitmap page.228 *229 * This data record is used for XLOG_HASH_INIT_BITMAP_PAGE230 *231 * Backup Blk 0: bitmap page232 * Backup Blk 1: meta page233 */234typedef struct xl_hash_init_bitmap_page235{236	uint16		bmsize;237} xl_hash_init_bitmap_page;238 239#define SizeOfHashInitBitmapPage	\240	(offsetof(xl_hash_init_bitmap_page, bmsize) + sizeof(uint16))241 242/*243 * This is what we need for index tuple deletion and to244 * update the meta page.245 *246 * This data record is used for XLOG_HASH_VACUUM_ONE_PAGE247 *248 * Backup Blk 0: bucket page249 * Backup Blk 1: meta page250 */251typedef struct xl_hash_vacuum_one_page252{253	TransactionId snapshotConflictHorizon;254	uint16		ntuples;255	bool		isCatalogRel;	/* to handle recovery conflict during logical256								 * decoding on standby */257 258	/* TARGET OFFSET NUMBERS */259	OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];260} xl_hash_vacuum_one_page;261 262#define SizeOfHashVacuumOnePage offsetof(xl_hash_vacuum_one_page, offsets)263 264extern void hash_redo(XLogReaderState *record);265extern void hash_desc(StringInfo buf, XLogReaderState *record);266extern const char *hash_identify(uint8 info);267extern void hash_mask(char *pagedata, BlockNumber blkno);268 269#endif							/* HASH_XLOG_H */270 
codekingpro/portable-devtools · Team Ai