PostgreSQL Source Code git master
Loading...
Searching...
No Matches
sequence_xlog.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * sequence.c
4 * RMGR WAL routines for sequences.
5 *
6 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 *
10 * IDENTIFICATION
11 * src/backend/commands/sequence_xlog.c
12 *
13 *-------------------------------------------------------------------------
14 */
15#include "postgres.h"
16
17#include "access/bufmask.h"
18#include "access/xlogutils.h"
20#include "storage/bufmgr.h"
21
22void
24{
25 XLogRecPtr lsn = record->EndRecPtr;
26 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
27 Buffer buffer;
28 Page page;
30 char *item;
31 Size itemsz;
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 */
51
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
63
64 memcpy(page, localpage, BufferGetPageSize(buffer));
65 MarkBufferDirty(buffer);
66 UnlockReleaseBuffer(buffer);
67
69}
70
71/*
72 * Mask a Sequence page before performing consistency checks on it.
73 */
74void
75seq_mask(char *page, BlockNumber blkno)
76{
78
80}
uint32 BlockNumber
Definition block.h:31
int Buffer
Definition buf.h:23
void mask_page_lsn_and_checksum(Page page)
Definition bufmask.c:31
void mask_unused_space(Page page)
Definition bufmask.c:71
void UnlockReleaseBuffer(Buffer buffer)
Definition bufmgr.c:5518
void MarkBufferDirty(Buffer buffer)
Definition bufmgr.c:3056
static Page BufferGetPage(Buffer buffer)
Definition bufmgr.h:466
static Size BufferGetPageSize(Buffer buffer)
Definition bufmgr.h:455
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
uint8_t uint8
Definition c.h:544
size_t Size
Definition c.h:619
#define PANIC
Definition elog.h:42
#define elog(elevel,...)
Definition elog.h:226
void pfree(void *pointer)
Definition mcxt.c:1616
void * palloc(Size size)
Definition mcxt.c:1387
#define InvalidOffsetNumber
Definition off.h:26
#define FirstOffsetNumber
Definition off.h:27
static int fb(int x)
void seq_mask(char *page, BlockNumber blkno)
void seq_redo(XLogReaderState *record)
#define SEQ_MAGIC
#define XLOG_SEQ_LOG
XLogRecPtr EndRecPtr
Definition xlogreader.h:206
uint64 XLogRecPtr
Definition xlogdefs.h:21
#define XLogRecGetDataLen(decoder)
Definition xlogreader.h:415
#define XLogRecGetInfo(decoder)
Definition xlogreader.h:409
#define XLogRecGetData(decoder)
Definition xlogreader.h:414
Buffer XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id)
Definition xlogutils.c:315