PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
gistxlog.h File Reference
#include "access/gist.h"
#include "access/xlogreader.h"
#include "lib/stringinfo.h"
Include dependency graph for gistxlog.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  gistxlogPageUpdate
 
struct  gistxlogDelete
 
struct  gistxlogPageSplit
 
struct  gistxlogPageDelete
 
struct  gistxlogPageReuse
 

Macros

#define XLOG_GIST_PAGE_UPDATE   0x00
 
#define XLOG_GIST_DELETE
 
#define XLOG_GIST_PAGE_REUSE
 
#define XLOG_GIST_PAGE_SPLIT   0x30
 
#define XLOG_GIST_PAGE_DELETE   0x60
 
#define XLOG_GIST_ASSIGN_LSN   0x70 /* nop, assign new LSN */
 
#define SizeOfGistxlogDelete   offsetof(gistxlogDelete, offsets)
 
#define SizeOfGistxlogPageDelete   (offsetof(gistxlogPageDelete, downlinkOffset) + sizeof(OffsetNumber))
 
#define SizeOfGistxlogPageReuse   (offsetof(gistxlogPageReuse, isCatalogRel) + sizeof(bool))
 

Typedefs

typedef struct gistxlogPageUpdate gistxlogPageUpdate
 
typedef struct gistxlogDelete gistxlogDelete
 
typedef struct gistxlogPageSplit gistxlogPageSplit
 
typedef struct gistxlogPageDelete gistxlogPageDelete
 
typedef struct gistxlogPageReuse gistxlogPageReuse
 

Functions

void gist_redo (XLogReaderState *record)
 
void gist_desc (StringInfo buf, XLogReaderState *record)
 
const char * gist_identify (uint8 info)
 
void gist_xlog_startup (void)
 
void gist_xlog_cleanup (void)
 
void gist_mask (char *pagedata, BlockNumber blkno)
 

Macro Definition Documentation

◆ SizeOfGistxlogDelete

#define SizeOfGistxlogDelete   offsetof(gistxlogDelete, offsets)

Definition at line 59 of file gistxlog.h.

◆ SizeOfGistxlogPageDelete

#define SizeOfGistxlogPageDelete   (offsetof(gistxlogPageDelete, downlinkOffset) + sizeof(OffsetNumber))

Definition at line 91 of file gistxlog.h.

◆ SizeOfGistxlogPageReuse

#define SizeOfGistxlogPageReuse   (offsetof(gistxlogPageReuse, isCatalogRel) + sizeof(bool))

Definition at line 106 of file gistxlog.h.

◆ XLOG_GIST_ASSIGN_LSN

#define XLOG_GIST_ASSIGN_LSN   0x70 /* nop, assign new LSN */

Definition at line 27 of file gistxlog.h.

◆ XLOG_GIST_DELETE

#define XLOG_GIST_DELETE
Value:
0x10 /* delete leaf index tuples for a
* page */

Definition at line 21 of file gistxlog.h.

◆ XLOG_GIST_PAGE_DELETE

#define XLOG_GIST_PAGE_DELETE   0x60

Definition at line 26 of file gistxlog.h.

◆ XLOG_GIST_PAGE_REUSE

#define XLOG_GIST_PAGE_REUSE
Value:
0x20 /* old page is about to be reused
* from FSM */

Definition at line 22 of file gistxlog.h.

◆ XLOG_GIST_PAGE_SPLIT

#define XLOG_GIST_PAGE_SPLIT   0x30

Definition at line 23 of file gistxlog.h.

◆ XLOG_GIST_PAGE_UPDATE

#define XLOG_GIST_PAGE_UPDATE   0x00

Definition at line 20 of file gistxlog.h.

Typedef Documentation

◆ gistxlogDelete

◆ gistxlogPageDelete

◆ gistxlogPageReuse

◆ gistxlogPageSplit

◆ gistxlogPageUpdate

Function Documentation

◆ gist_desc()

void gist_desc ( StringInfo  buf,
XLogReaderState record 
)

Definition at line 61 of file gistdesc.c.

62{
63 char *rec = XLogRecGetData(record);
64 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
65
66 switch (info)
67 {
70 break;
73 break;
76 break;
79 break;
82 break;
84 /* No details to write out */
85 break;
86 }
87}
uint8_t uint8
Definition: c.h:486
static void out_gistxlogPageDelete(StringInfo buf, gistxlogPageDelete *xlrec)
Definition: gistdesc.c:52
static void out_gistxlogPageUpdate(StringInfo buf, gistxlogPageUpdate *xlrec)
Definition: gistdesc.c:21
static void out_gistxlogPageSplit(StringInfo buf, gistxlogPageSplit *xlrec)
Definition: gistdesc.c:45
static void out_gistxlogDelete(StringInfo buf, gistxlogDelete *xlrec)
Definition: gistdesc.c:37
static void out_gistxlogPageReuse(StringInfo buf, gistxlogPageReuse *xlrec)
Definition: gistdesc.c:26
#define XLOG_GIST_ASSIGN_LSN
Definition: gistxlog.h:27
#define XLOG_GIST_PAGE_REUSE
Definition: gistxlog.h:22
#define XLOG_GIST_PAGE_DELETE
Definition: gistxlog.h:26
#define XLOG_GIST_DELETE
Definition: gistxlog.h:21
#define XLOG_GIST_PAGE_SPLIT
Definition: gistxlog.h:23
#define XLOG_GIST_PAGE_UPDATE
Definition: gistxlog.h:20
static char * buf
Definition: pg_test_fsync.c:72
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:410
#define XLogRecGetData(decoder)
Definition: xlogreader.h:415

References buf, out_gistxlogDelete(), out_gistxlogPageDelete(), out_gistxlogPageReuse(), out_gistxlogPageSplit(), out_gistxlogPageUpdate(), XLOG_GIST_ASSIGN_LSN, XLOG_GIST_DELETE, XLOG_GIST_PAGE_DELETE, XLOG_GIST_PAGE_REUSE, XLOG_GIST_PAGE_SPLIT, XLOG_GIST_PAGE_UPDATE, XLogRecGetData, and XLogRecGetInfo.

◆ gist_identify()

const char * gist_identify ( uint8  info)

Definition at line 90 of file gistdesc.c.

91{
92 const char *id = NULL;
93
94 switch (info & ~XLR_INFO_MASK)
95 {
97 id = "PAGE_UPDATE";
98 break;
100 id = "DELETE";
101 break;
103 id = "PAGE_REUSE";
104 break;
106 id = "PAGE_SPLIT";
107 break;
109 id = "PAGE_DELETE";
110 break;
112 id = "ASSIGN_LSN";
113 break;
114 }
115
116 return id;
117}
#define XLR_INFO_MASK
Definition: xlogrecord.h:62

References XLOG_GIST_ASSIGN_LSN, XLOG_GIST_DELETE, XLOG_GIST_PAGE_DELETE, XLOG_GIST_PAGE_REUSE, XLOG_GIST_PAGE_SPLIT, XLOG_GIST_PAGE_UPDATE, and XLR_INFO_MASK.

◆ gist_mask()

void gist_mask ( char *  pagedata,
BlockNumber  blkno 
)

Definition at line 453 of file gistxlog.c.

454{
455 Page page = (Page) pagedata;
456
458
460 mask_unused_space(page);
461
462 /*
463 * NSN is nothing but a special purpose LSN. Hence, mask it for the same
464 * reason as mask_page_lsn_and_checksum.
465 */
467
468 /*
469 * We update F_FOLLOW_RIGHT flag on the left child after writing WAL
470 * record. Hence, mask this flag. See gistplacetopage() for details.
471 */
473
474 if (GistPageIsLeaf(page))
475 {
476 /*
477 * In gist leaf pages, it is possible to modify the LP_FLAGS without
478 * emitting any WAL record. Hence, mask the line pointer flags. See
479 * gistkillitems() for details.
480 */
481 mask_lp_flags(page);
482 }
483
484 /*
485 * During gist redo, we never mark a page as garbage. Hence, mask it to
486 * ignore any differences.
487 */
489}
void mask_lp_flags(Page page)
Definition: bufmask.c:95
void mask_page_lsn_and_checksum(Page page)
Definition: bufmask.c:31
void mask_unused_space(Page page)
Definition: bufmask.c:71
void mask_page_hint_bits(Page page)
Definition: bufmask.c:46
#define MASK_MARKER
Definition: bufmask.h:24
Pointer Page
Definition: bufpage.h:81
uint64_t uint64
Definition: c.h:489
#define GistMarkFollowRight(page)
Definition: gist.h:184
#define GistClearPageHasGarbage(page)
Definition: gist.h:181
#define GistPageIsLeaf(page)
Definition: gist.h:170
#define GistPageSetNSN(page, val)
Definition: gist.h:188

References GistClearPageHasGarbage, GistMarkFollowRight, GistPageIsLeaf, GistPageSetNSN, mask_lp_flags(), MASK_MARKER, mask_page_hint_bits(), mask_page_lsn_and_checksum(), and mask_unused_space().

◆ gist_redo()

void gist_redo ( XLogReaderState record)

Definition at line 397 of file gistxlog.c.

398{
399 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
400 MemoryContext oldCxt;
401
402 /*
403 * GiST indexes do not require any conflict processing. NB: If we ever
404 * implement a similar optimization we have in b-tree, and remove killed
405 * tuples outside VACUUM, we'll need to handle that here.
406 */
407
409 switch (info)
410 {
413 break;
414 case XLOG_GIST_DELETE:
415 gistRedoDeleteRecord(record);
416 break;
418 gistRedoPageReuse(record);
419 break;
422 break;
424 gistRedoPageDelete(record);
425 break;
427 /* nop. See gistGetFakeLSN(). */
428 break;
429 default:
430 elog(PANIC, "gist_redo: unknown op code %u", info);
431 }
432
433 MemoryContextSwitchTo(oldCxt);
435}
#define PANIC
Definition: elog.h:42
#define elog(elevel,...)
Definition: elog.h:225
static void gistRedoPageReuse(XLogReaderState *record)
Definition: gistxlog.c:376
static void gistRedoPageUpdateRecord(XLogReaderState *record)
Definition: gistxlog.c:70
static void gistRedoPageSplitRecord(XLogReaderState *record)
Definition: gistxlog.c:247
static void gistRedoPageDelete(XLogReaderState *record)
Definition: gistxlog.c:342
static void gistRedoDeleteRecord(XLogReaderState *record)
Definition: gistxlog.c:172
static MemoryContext opCtx
Definition: gistxlog.c:26
void MemoryContextReset(MemoryContext context)
Definition: mcxt.c:383
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:124

References elog, gistRedoDeleteRecord(), gistRedoPageDelete(), gistRedoPageReuse(), gistRedoPageSplitRecord(), gistRedoPageUpdateRecord(), MemoryContextReset(), MemoryContextSwitchTo(), opCtx, PANIC, XLOG_GIST_ASSIGN_LSN, XLOG_GIST_DELETE, XLOG_GIST_PAGE_DELETE, XLOG_GIST_PAGE_REUSE, XLOG_GIST_PAGE_SPLIT, XLOG_GIST_PAGE_UPDATE, and XLogRecGetInfo.

◆ gist_xlog_cleanup()

void gist_xlog_cleanup ( void  )

Definition at line 444 of file gistxlog.c.

445{
447}
void MemoryContextDelete(MemoryContext context)
Definition: mcxt.c:454

References MemoryContextDelete(), and opCtx.

◆ gist_xlog_startup()

void gist_xlog_startup ( void  )

Definition at line 438 of file gistxlog.c.

439{
441}
MemoryContext createTempGistContext(void)
Definition: gist.c:123

References createTempGistContext(), and opCtx.