Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * gistdesc.c 4 : * rmgr descriptor routines for access/gist/gistxlog.c 5 : * 6 : * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group 7 : * Portions Copyright (c) 1994, Regents of the University of California 8 : * 9 : * 10 : * IDENTIFICATION 11 : * src/backend/access/rmgrdesc/gistdesc.c 12 : * 13 : *------------------------------------------------------------------------- 14 : */ 15 : #include "postgres.h" 16 : 17 : #include "access/gistxlog.h" 18 : #include "lib/stringinfo.h" 19 : #include "storage/relfilelocator.h" 20 : 21 : static void 22 0 : out_gistxlogPageUpdate(StringInfo buf, gistxlogPageUpdate *xlrec) 23 : { 24 0 : } 25 : 26 : static void 27 0 : out_gistxlogPageReuse(StringInfo buf, gistxlogPageReuse *xlrec) 28 : { 29 0 : appendStringInfo(buf, "rel %u/%u/%u; blk %u; snapshotConflictHorizon %u:%u", 30 : xlrec->locator.spcOid, xlrec->locator.dbOid, 31 : xlrec->locator.relNumber, xlrec->block, 32 0 : EpochFromFullTransactionId(xlrec->snapshotConflictHorizon), 33 0 : XidFromFullTransactionId(xlrec->snapshotConflictHorizon)); 34 0 : } 35 : 36 : static void 37 0 : out_gistxlogDelete(StringInfo buf, gistxlogDelete *xlrec) 38 : { 39 0 : appendStringInfo(buf, "delete: snapshotConflictHorizon %u, nitems: %u", 40 0 : xlrec->snapshotConflictHorizon, xlrec->ntodelete); 41 0 : } 42 : 43 : static void 44 0 : out_gistxlogPageSplit(StringInfo buf, gistxlogPageSplit *xlrec) 45 : { 46 0 : appendStringInfo(buf, "page_split: splits to %d pages", 47 0 : xlrec->npage); 48 0 : } 49 : 50 : static void 51 0 : out_gistxlogPageDelete(StringInfo buf, gistxlogPageDelete *xlrec) 52 : { 53 0 : appendStringInfo(buf, "deleteXid %u:%u; downlink %u", 54 0 : EpochFromFullTransactionId(xlrec->deleteXid), 55 0 : XidFromFullTransactionId(xlrec->deleteXid), 56 0 : xlrec->downlinkOffset); 57 0 : } 58 : 59 : void 60 0 : gist_desc(StringInfo buf, XLogReaderState *record) 61 : { 62 0 : char *rec = XLogRecGetData(record); 63 0 : uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; 64 : 65 0 : switch (info) 66 : { 67 0 : case XLOG_GIST_PAGE_UPDATE: 68 0 : out_gistxlogPageUpdate(buf, (gistxlogPageUpdate *) rec); 69 0 : break; 70 0 : case XLOG_GIST_PAGE_REUSE: 71 0 : out_gistxlogPageReuse(buf, (gistxlogPageReuse *) rec); 72 0 : break; 73 0 : case XLOG_GIST_DELETE: 74 0 : out_gistxlogDelete(buf, (gistxlogDelete *) rec); 75 0 : break; 76 0 : case XLOG_GIST_PAGE_SPLIT: 77 0 : out_gistxlogPageSplit(buf, (gistxlogPageSplit *) rec); 78 0 : break; 79 0 : case XLOG_GIST_PAGE_DELETE: 80 0 : out_gistxlogPageDelete(buf, (gistxlogPageDelete *) rec); 81 0 : break; 82 0 : case XLOG_GIST_ASSIGN_LSN: 83 : /* No details to write out */ 84 0 : break; 85 : } 86 0 : } 87 : 88 : const char * 89 0 : gist_identify(uint8 info) 90 : { 91 0 : const char *id = NULL; 92 : 93 0 : switch (info & ~XLR_INFO_MASK) 94 : { 95 0 : case XLOG_GIST_PAGE_UPDATE: 96 0 : id = "PAGE_UPDATE"; 97 0 : break; 98 0 : case XLOG_GIST_DELETE: 99 0 : id = "DELETE"; 100 0 : break; 101 0 : case XLOG_GIST_PAGE_REUSE: 102 0 : id = "PAGE_REUSE"; 103 0 : break; 104 0 : case XLOG_GIST_PAGE_SPLIT: 105 0 : id = "PAGE_SPLIT"; 106 0 : break; 107 0 : case XLOG_GIST_PAGE_DELETE: 108 0 : id = "PAGE_DELETE"; 109 0 : break; 110 0 : case XLOG_GIST_ASSIGN_LSN: 111 0 : id = "ASSIGN_LSN"; 112 0 : break; 113 : } 114 : 115 0 : return id; 116 : }