PostgreSQL Source Code git master
sequence_xlog.h File Reference
#include "access/xlogreader.h"
#include "lib/stringinfo.h"
Include dependency graph for sequence_xlog.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  sequence_magic
 
struct  xl_seq_rec
 

Macros

#define XLOG_SEQ_LOG   0x00
 
#define SEQ_MAGIC   0x1717
 

Typedefs

typedef struct sequence_magic sequence_magic
 
typedef struct xl_seq_rec xl_seq_rec
 

Functions

void seq_redo (XLogReaderState *record)
 
void seq_desc (StringInfo buf, XLogReaderState *record)
 
const char * seq_identify (uint8 info)
 
void seq_mask (char *page, BlockNumber blkno)
 

Macro Definition Documentation

◆ SEQ_MAGIC

#define SEQ_MAGIC   0x1717

Definition at line 26 of file sequence_xlog.h.

◆ XLOG_SEQ_LOG

#define XLOG_SEQ_LOG   0x00

Definition at line 21 of file sequence_xlog.h.

Typedef Documentation

◆ sequence_magic

◆ xl_seq_rec

typedef struct xl_seq_rec xl_seq_rec

Function Documentation

◆ seq_desc()

void seq_desc ( StringInfo  buf,
XLogReaderState record 
)

Definition at line 21 of file seqdesc.c.

22{
23 char *rec = XLogRecGetData(record);
24 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
25 xl_seq_rec *xlrec = (xl_seq_rec *) rec;
26
27 if (info == XLOG_SEQ_LOG)
28 appendStringInfo(buf, "rel %u/%u/%u",
29 xlrec->locator.spcOid, xlrec->locator.dbOid,
30 xlrec->locator.relNumber);
31}
uint8_t uint8
Definition: c.h:539
static char * buf
Definition: pg_test_fsync.c:72
#define XLOG_SEQ_LOG
Definition: sequence_xlog.h:21
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:145
RelFileNumber relNumber
RelFileLocator locator
Definition: sequence_xlog.h:36
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:409
#define XLogRecGetData(decoder)
Definition: xlogreader.h:414

References appendStringInfo(), buf, RelFileLocator::dbOid, xl_seq_rec::locator, RelFileLocator::relNumber, RelFileLocator::spcOid, XLOG_SEQ_LOG, XLogRecGetData, and XLogRecGetInfo.

◆ seq_identify()

const char * seq_identify ( uint8  info)

Definition at line 34 of file seqdesc.c.

35{
36 const char *id = NULL;
37
38 switch (info & ~XLR_INFO_MASK)
39 {
40 case XLOG_SEQ_LOG:
41 id = "LOG";
42 break;
43 }
44
45 return id;
46}
#define XLR_INFO_MASK
Definition: xlogrecord.h:62

References XLOG_SEQ_LOG, and XLR_INFO_MASK.

◆ seq_mask()

void seq_mask ( char *  page,
BlockNumber  blkno 
)

Definition at line 75 of file sequence_xlog.c.

76{
78
80}
void mask_page_lsn_and_checksum(Page page)
Definition: bufmask.c:31
void mask_unused_space(Page page)
Definition: bufmask.c:71

References mask_page_lsn_and_checksum(), and mask_unused_space().

◆ seq_redo()

void seq_redo ( XLogReaderState record)

Definition at line 23 of file sequence_xlog.c.

24{
25 XLogRecPtr lsn = record->EndRecPtr;
26 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
27 Buffer buffer;
28 Page page;
29 Page localpage;
30 char *item;
31 Size itemsz;
32 xl_seq_rec *xlrec = (xl_seq_rec *) XLogRecGetData(record);
34
35 if (info != XLOG_SEQ_LOG)
36 elog(PANIC, "seq_redo: unknown op code %u", info);
37
38 buffer = XLogInitBufferForRedo(record, 0);
39 page = BufferGetPage(buffer);
40
41 /*
42 * We always reinit the page. However, since this WAL record type is also
43 * used for updating sequences, it's possible that a hot-standby backend
44 * is examining the page concurrently; so we mustn't transiently trash the
45 * buffer. The solution is to build the correct new page contents in
46 * local workspace and then memcpy into the buffer. Then only bytes that
47 * are supposed to change will change, even transiently. We must palloc
48 * the local page for alignment reasons.
49 */
50 localpage = (Page) palloc(BufferGetPageSize(buffer));
51
52 PageInit(localpage, BufferGetPageSize(buffer), sizeof(sequence_magic));
53 sm = (sequence_magic *) PageGetSpecialPointer(localpage);
54 sm->magic = SEQ_MAGIC;
55
56 item = (char *) xlrec + sizeof(xl_seq_rec);
57 itemsz = XLogRecGetDataLen(record) - sizeof(xl_seq_rec);
58
59 if (PageAddItem(localpage, item, itemsz, FirstOffsetNumber, false, false) == InvalidOffsetNumber)
60 elog(PANIC, "seq_redo: failed to add item to page");
61
62 PageSetLSN(localpage, lsn);
63
64 memcpy(page, localpage, BufferGetPageSize(buffer));
65 MarkBufferDirty(buffer);
66 UnlockReleaseBuffer(buffer);
67
68 pfree(localpage);
69}
int Buffer
Definition: buf.h:23
void UnlockReleaseBuffer(Buffer buffer)
Definition: bufmgr.c:5383
void MarkBufferDirty(Buffer buffer)
Definition: bufmgr.c:2943
static Page BufferGetPage(Buffer buffer)
Definition: bufmgr.h:436
static Size BufferGetPageSize(Buffer buffer)
Definition: bufmgr.h:425
void PageInit(Page page, Size pageSize, Size specialSize)
Definition: bufpage.c:42
#define PageGetSpecialPointer(page)
Definition: bufpage.h:338
static void PageSetLSN(Page page, XLogRecPtr lsn)
Definition: bufpage.h:390
PageData * Page
Definition: bufpage.h:81
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
Definition: bufpage.h:471
size_t Size
Definition: c.h:613
#define PANIC
Definition: elog.h:42
#define elog(elevel,...)
Definition: elog.h:226
void pfree(void *pointer)
Definition: mcxt.c:1594
void * palloc(Size size)
Definition: mcxt.c:1365
#define InvalidOffsetNumber
Definition: off.h:26
#define FirstOffsetNumber
Definition: off.h:27
#define SEQ_MAGIC
Definition: sequence_xlog.h:26
struct xl_seq_rec xl_seq_rec
XLogRecPtr EndRecPtr
Definition: xlogreader.h:206
uint64 XLogRecPtr
Definition: xlogdefs.h:21
#define XLogRecGetDataLen(decoder)
Definition: xlogreader.h:415
Buffer XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id)
Definition: xlogutils.c:315

References BufferGetPage(), BufferGetPageSize(), elog, XLogReaderState::EndRecPtr, FirstOffsetNumber, InvalidOffsetNumber, sequence_magic::magic, MarkBufferDirty(), PageAddItem, PageGetSpecialPointer, PageInit(), PageSetLSN(), palloc(), PANIC, pfree(), SEQ_MAGIC, UnlockReleaseBuffer(), XLOG_SEQ_LOG, XLogInitBufferForRedo(), XLogRecGetData, XLogRecGetDataLen, and XLogRecGetInfo.