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

Go to the source code of this file.

Data Structures

struct  spgxlogState
 
struct  spgxlogAddLeaf
 
struct  spgxlogMoveLeafs
 
struct  spgxlogAddNode
 
struct  spgxlogSplitTuple
 
struct  spgxlogPickSplit
 
struct  spgxlogVacuumLeaf
 
struct  spgxlogVacuumRoot
 
struct  spgxlogVacuumRedirect
 

Macros

#define XLOG_SPGIST_CREATE_INDEX   0x00
 
#define XLOG_SPGIST_ADD_LEAF   0x10
 
#define XLOG_SPGIST_MOVE_LEAFS   0x20
 
#define XLOG_SPGIST_ADD_NODE   0x30
 
#define XLOG_SPGIST_SPLIT_TUPLE   0x40
 
#define XLOG_SPGIST_PICKSPLIT   0x50
 
#define XLOG_SPGIST_VACUUM_LEAF   0x60
 
#define XLOG_SPGIST_VACUUM_ROOT   0x70
 
#define XLOG_SPGIST_VACUUM_REDIRECT   0x80
 
#define SizeOfSpgxlogMoveLeafs   offsetof(spgxlogMoveLeafs, offsets)
 
#define SizeOfSpgxlogPickSplit   offsetof(spgxlogPickSplit, offsets)
 
#define SizeOfSpgxlogVacuumLeaf   offsetof(spgxlogVacuumLeaf, offsets)
 
#define SizeOfSpgxlogVacuumRoot   offsetof(spgxlogVacuumRoot, offsets)
 
#define SizeOfSpgxlogVacuumRedirect   offsetof(spgxlogVacuumRedirect, offsets)
 

Typedefs

typedef struct spgxlogState spgxlogState
 
typedef struct spgxlogAddLeaf spgxlogAddLeaf
 
typedef struct spgxlogMoveLeafs spgxlogMoveLeafs
 
typedef struct spgxlogAddNode spgxlogAddNode
 
typedef struct spgxlogSplitTuple spgxlogSplitTuple
 
typedef struct spgxlogPickSplit spgxlogPickSplit
 
typedef struct spgxlogVacuumLeaf spgxlogVacuumLeaf
 
typedef struct spgxlogVacuumRoot spgxlogVacuumRoot
 
typedef struct
spgxlogVacuumRedirect 
spgxlogVacuumRedirect
 

Functions

void spg_redo (XLogReaderState *record)
 
void spg_desc (StringInfo buf, XLogReaderState *record)
 
const char * spg_identify (uint8 info)
 
void spg_xlog_startup (void)
 
void spg_xlog_cleanup (void)
 
void spg_mask (char *pagedata, BlockNumber blkno)
 

Macro Definition Documentation

#define SizeOfSpgxlogMoveLeafs   offsetof(spgxlogMoveLeafs, offsets)

Definition at line 91 of file spgxlog.h.

Referenced by moveLeafs(), and spgRedoMoveLeafs().

#define SizeOfSpgxlogPickSplit   offsetof(spgxlogPickSplit, offsets)

Definition at line 199 of file spgxlog.h.

Referenced by doPickSplit(), and spgRedoPickSplit().

#define SizeOfSpgxlogVacuumLeaf   offsetof(spgxlogVacuumLeaf, offsets)

Definition at line 223 of file spgxlog.h.

Referenced by spgRedoVacuumLeaf(), and vacuumLeafPage().

#define SizeOfSpgxlogVacuumRedirect   offsetof(spgxlogVacuumRedirect, offsets)

Definition at line 248 of file spgxlog.h.

Referenced by vacuumRedirectAndPlaceholder().

#define SizeOfSpgxlogVacuumRoot   offsetof(spgxlogVacuumRoot, offsets)

Definition at line 236 of file spgxlog.h.

Referenced by vacuumLeafRoot().

#define XLOG_SPGIST_ADD_LEAF   0x10

Definition at line 22 of file spgxlog.h.

Referenced by addLeafTuple(), spg_desc(), spg_identify(), and spg_redo().

#define XLOG_SPGIST_ADD_NODE   0x30

Definition at line 24 of file spgxlog.h.

Referenced by spg_desc(), spg_identify(), spg_redo(), and spgAddNodeAction().

#define XLOG_SPGIST_CREATE_INDEX   0x00

Definition at line 21 of file spgxlog.h.

Referenced by spg_desc(), spg_identify(), spg_redo(), and spgbuild().

#define XLOG_SPGIST_MOVE_LEAFS   0x20

Definition at line 23 of file spgxlog.h.

Referenced by moveLeafs(), spg_desc(), spg_identify(), and spg_redo().

#define XLOG_SPGIST_PICKSPLIT   0x50

Definition at line 26 of file spgxlog.h.

Referenced by doPickSplit(), spg_desc(), spg_identify(), and spg_redo().

#define XLOG_SPGIST_SPLIT_TUPLE   0x40

Definition at line 25 of file spgxlog.h.

Referenced by spg_desc(), spg_identify(), spg_redo(), and spgSplitNodeAction().

#define XLOG_SPGIST_VACUUM_LEAF   0x60

Definition at line 27 of file spgxlog.h.

Referenced by spg_desc(), spg_identify(), spg_redo(), and vacuumLeafPage().

#define XLOG_SPGIST_VACUUM_REDIRECT   0x80

Definition at line 29 of file spgxlog.h.

Referenced by spg_desc(), spg_identify(), spg_redo(), and vacuumRedirectAndPlaceholder().

#define XLOG_SPGIST_VACUUM_ROOT   0x70

Definition at line 28 of file spgxlog.h.

Referenced by spg_desc(), spg_identify(), spg_redo(), and vacuumLeafRoot().

Typedef Documentation

Function Documentation

void spg_desc ( StringInfo  buf,
XLogReaderState record 
)

Definition at line 20 of file spgdesc.c.

References appendStringInfo(), appendStringInfoString(), spgxlogPickSplit::innerIsParent, spgxlogPickSplit::isRootSplit, spgxlogPickSplit::nDelete, spgxlogAddLeaf::newPage, spgxlogPickSplit::nInsert, spgxlogAddLeaf::offnumHeadLeaf, spgxlogAddLeaf::offnumLeaf, spgxlogAddLeaf::offnumParent, spgxlogAddLeaf::storesNulls, XLOG_SPGIST_ADD_LEAF, XLOG_SPGIST_ADD_NODE, XLOG_SPGIST_CREATE_INDEX, XLOG_SPGIST_MOVE_LEAFS, XLOG_SPGIST_PICKSPLIT, XLOG_SPGIST_SPLIT_TUPLE, XLOG_SPGIST_VACUUM_LEAF, XLOG_SPGIST_VACUUM_REDIRECT, XLOG_SPGIST_VACUUM_ROOT, XLogRecGetData, XLogRecGetInfo, and XLR_INFO_MASK.

21 {
22  char *rec = XLogRecGetData(record);
23  uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
24 
25  switch (info)
26  {
28  break;
30  {
31  spgxlogAddLeaf *xlrec = (spgxlogAddLeaf *) rec;
32 
33  appendStringInfoString(buf, "add leaf to page");
34  appendStringInfo(buf, "; off %u; headoff %u; parentoff %u",
35  xlrec->offnumLeaf, xlrec->offnumHeadLeaf,
36  xlrec->offnumParent);
37  if (xlrec->newPage)
38  appendStringInfoString(buf, " (newpage)");
39  if (xlrec->storesNulls)
40  appendStringInfoString(buf, " (nulls)");
41  }
42  break;
44  appendStringInfo(buf, "%u leafs",
45  ((spgxlogMoveLeafs *) rec)->nMoves);
46  break;
48  appendStringInfo(buf, "off %u",
49  ((spgxlogAddNode *) rec)->offnum);
50  break;
52  appendStringInfo(buf, "prefix off: %u, postfix off: %u (same %d, new %d)",
53  ((spgxlogSplitTuple *) rec)->offnumPrefix,
54  ((spgxlogSplitTuple *) rec)->offnumPostfix,
55  ((spgxlogSplitTuple *) rec)->postfixBlkSame,
56  ((spgxlogSplitTuple *) rec)->newPage
57  );
58  break;
60  {
61  spgxlogPickSplit *xlrec = (spgxlogPickSplit *) rec;
62 
63  appendStringInfo(buf, "ndel %u; nins %u",
64  xlrec->nDelete, xlrec->nInsert);
65  if (xlrec->innerIsParent)
66  appendStringInfoString(buf, " (innerIsParent)");
67  if (xlrec->isRootSplit)
68  appendStringInfoString(buf, " (isRootSplit)");
69  }
70  break;
72  /* no further information */
73  break;
75  /* no further information */
76  break;
78  appendStringInfo(buf, "newest XID %u",
79  ((spgxlogVacuumRedirect *) rec)->newestRedirectXid);
80  break;
81  }
82 }
#define XLOG_SPGIST_MOVE_LEAFS
Definition: spgxlog.h:23
#define XLOG_SPGIST_VACUUM_REDIRECT
Definition: spgxlog.h:29
uint16 nDelete
Definition: spgxlog.h:169
OffsetNumber offnumParent
Definition: spgxlog.h:53
#define XLOG_SPGIST_SPLIT_TUPLE
Definition: spgxlog.h:25
OffsetNumber offnumLeaf
Definition: spgxlog.h:50
unsigned char uint8
Definition: c.h:256
#define XLOG_SPGIST_ADD_NODE
Definition: spgxlog.h:24
#define XLOG_SPGIST_ADD_LEAF
Definition: spgxlog.h:22
uint16 nInsert
Definition: spgxlog.h:170
bool innerIsParent
Definition: spgxlog.h:181
#define XLOG_SPGIST_PICKSPLIT
Definition: spgxlog.h:26
#define XLOG_SPGIST_VACUUM_ROOT
Definition: spgxlog.h:28
#define XLogRecGetData(decoder)
Definition: xlogreader.h:226
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:78
#define XLOG_SPGIST_CREATE_INDEX
Definition: spgxlog.h:21
bool newPage
Definition: spgxlog.h:48
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:157
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:222
OffsetNumber offnumHeadLeaf
Definition: spgxlog.h:51
bool storesNulls
Definition: spgxlog.h:49
#define XLR_INFO_MASK
Definition: xlogrecord.h:62
#define XLOG_SPGIST_VACUUM_LEAF
Definition: spgxlog.h:27
bool isRootSplit
Definition: spgxlog.h:167
const char* spg_identify ( uint8  info)

Definition at line 85 of file spgdesc.c.

References XLOG_SPGIST_ADD_LEAF, XLOG_SPGIST_ADD_NODE, XLOG_SPGIST_CREATE_INDEX, XLOG_SPGIST_MOVE_LEAFS, XLOG_SPGIST_PICKSPLIT, XLOG_SPGIST_SPLIT_TUPLE, XLOG_SPGIST_VACUUM_LEAF, XLOG_SPGIST_VACUUM_REDIRECT, XLOG_SPGIST_VACUUM_ROOT, and XLR_INFO_MASK.

86 {
87  const char *id = NULL;
88 
89  switch (info & ~XLR_INFO_MASK)
90  {
92  id = "CREATE_INDEX";
93  break;
95  id = "ADD_LEAF";
96  break;
98  id = "MOVE_LEAFS";
99  break;
101  id = "ADD_NODE";
102  break;
104  id = "SPLIT_TUPLE";
105  break;
107  id = "PICKSPLIT";
108  break;
110  id = "VACUUM_LEAF";
111  break;
113  id = "VACUUM_ROOT";
114  break;
116  id = "VACUUM_REDIRECT";
117  break;
118  }
119 
120  return id;
121 }
#define XLOG_SPGIST_MOVE_LEAFS
Definition: spgxlog.h:23
#define XLOG_SPGIST_VACUUM_REDIRECT
Definition: spgxlog.h:29
#define XLOG_SPGIST_SPLIT_TUPLE
Definition: spgxlog.h:25
#define XLOG_SPGIST_ADD_NODE
Definition: spgxlog.h:24
#define XLOG_SPGIST_ADD_LEAF
Definition: spgxlog.h:22
#define XLOG_SPGIST_PICKSPLIT
Definition: spgxlog.h:26
#define XLOG_SPGIST_VACUUM_ROOT
Definition: spgxlog.h:28
#define XLOG_SPGIST_CREATE_INDEX
Definition: spgxlog.h:21
#define XLR_INFO_MASK
Definition: xlogrecord.h:62
#define XLOG_SPGIST_VACUUM_LEAF
Definition: spgxlog.h:27
void spg_mask ( char *  pagedata,
BlockNumber  blkno 
)

Definition at line 1033 of file spgxlog.c.

References mask_page_hint_bits(), mask_page_lsn_and_checksum(), mask_unused_space(), and SpGistPageIsMeta.

1034 {
1035  Page page = (Page) pagedata;
1036 
1038 
1039  mask_page_hint_bits(page);
1040 
1041  /*
1042  * Any SpGist page other than meta contains unused space which needs to be
1043  * masked.
1044  */
1045  if (!SpGistPageIsMeta(page))
1046  mask_unused_space(page);
1047 }
void mask_page_hint_bits(Page page)
Definition: bufmask.c:46
void mask_unused_space(Page page)
Definition: bufmask.c:71
void mask_page_lsn_and_checksum(Page page)
Definition: bufmask.c:31
#define SpGistPageIsMeta(page)
Pointer Page
Definition: bufpage.h:74
void spg_redo ( XLogReaderState record)

Definition at line 971 of file spgxlog.c.

References elog, MemoryContextReset(), MemoryContextSwitchTo(), PANIC, spgRedoAddLeaf(), spgRedoAddNode(), spgRedoCreateIndex(), spgRedoMoveLeafs(), spgRedoPickSplit(), spgRedoSplitTuple(), spgRedoVacuumLeaf(), spgRedoVacuumRedirect(), spgRedoVacuumRoot(), XLOG_SPGIST_ADD_LEAF, XLOG_SPGIST_ADD_NODE, XLOG_SPGIST_CREATE_INDEX, XLOG_SPGIST_MOVE_LEAFS, XLOG_SPGIST_PICKSPLIT, XLOG_SPGIST_SPLIT_TUPLE, XLOG_SPGIST_VACUUM_LEAF, XLOG_SPGIST_VACUUM_REDIRECT, XLOG_SPGIST_VACUUM_ROOT, XLogRecGetInfo, and XLR_INFO_MASK.

972 {
973  uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
974  MemoryContext oldCxt;
975 
976  oldCxt = MemoryContextSwitchTo(opCtx);
977  switch (info)
978  {
980  spgRedoCreateIndex(record);
981  break;
983  spgRedoAddLeaf(record);
984  break;
986  spgRedoMoveLeafs(record);
987  break;
989  spgRedoAddNode(record);
990  break;
992  spgRedoSplitTuple(record);
993  break;
995  spgRedoPickSplit(record);
996  break;
998  spgRedoVacuumLeaf(record);
999  break;
1001  spgRedoVacuumRoot(record);
1002  break;
1004  spgRedoVacuumRedirect(record);
1005  break;
1006  default:
1007  elog(PANIC, "spg_redo: unknown op code %u", info);
1008  }
1009 
1010  MemoryContextSwitchTo(oldCxt);
1012 }
#define XLOG_SPGIST_MOVE_LEAFS
Definition: spgxlog.h:23
static void spgRedoVacuumRedirect(XLogReaderState *record)
Definition: spgxlog.c:894
#define XLOG_SPGIST_VACUUM_REDIRECT
Definition: spgxlog.h:29
static MemoryContext opCtx
Definition: spgxlog.c:27
#define XLOG_SPGIST_SPLIT_TUPLE
Definition: spgxlog.h:25
static void spgRedoAddNode(XLogReaderState *record)
Definition: spgxlog.c:318
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:109
unsigned char uint8
Definition: c.h:256
static void spgRedoSplitTuple(XLogReaderState *record)
Definition: spgxlog.c:485
#define XLOG_SPGIST_ADD_NODE
Definition: spgxlog.h:24
void MemoryContextReset(MemoryContext context)
Definition: mcxt.c:135
#define XLOG_SPGIST_ADD_LEAF
Definition: spgxlog.h:22
#define PANIC
Definition: elog.h:53
#define XLOG_SPGIST_PICKSPLIT
Definition: spgxlog.h:26
#define XLOG_SPGIST_VACUUM_ROOT
Definition: spgxlog.h:28
static void spgRedoAddLeaf(XLogReaderState *record)
Definition: spgxlog.c:108
#define XLOG_SPGIST_CREATE_INDEX
Definition: spgxlog.h:21
static void spgRedoVacuumLeaf(XLogReaderState *record)
Definition: spgxlog.c:785
static void spgRedoPickSplit(XLogReaderState *record)
Definition: spgxlog.c:563
static void spgRedoCreateIndex(XLogReaderState *record)
Definition: spgxlog.c:76
static void spgRedoVacuumRoot(XLogReaderState *record)
Definition: spgxlog.c:868
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:222
#define XLR_INFO_MASK
Definition: xlogrecord.h:62
#define XLOG_SPGIST_VACUUM_LEAF
Definition: spgxlog.h:27
#define elog
Definition: elog.h:219
static void spgRedoMoveLeafs(XLogReaderState *record)
Definition: spgxlog.c:205
void spg_xlog_cleanup ( void  )

Definition at line 1023 of file spgxlog.c.

References MemoryContextDelete().

1024 {
1026  opCtx = NULL;
1027 }
static MemoryContext opCtx
Definition: spgxlog.c:27
void MemoryContextDelete(MemoryContext context)
Definition: mcxt.c:200
void spg_xlog_startup ( void  )

Definition at line 1015 of file spgxlog.c.

References ALLOCSET_DEFAULT_SIZES, AllocSetContextCreate(), and CurrentMemoryContext.

1016 {
1018  "SP-GiST temporary context",
1020 }
static MemoryContext opCtx
Definition: spgxlog.c:27
#define ALLOCSET_DEFAULT_SIZES
Definition: memutils.h:165
MemoryContext CurrentMemoryContext
Definition: mcxt.c:37
MemoryContext AllocSetContextCreate(MemoryContext parent, const char *name, Size minContextSize, Size initBlockSize, Size maxBlockSize)
Definition: aset.c:322