PostgreSQL Source Code
git master
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-2025, 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
"
19
#include "
commands/sequence_xlog.h
"
20
#include "
storage/bufmgr.h
"
21
22
void
23
seq_redo
(
XLogReaderState
*record)
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);
33
sequence_magic
*sm;
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
}
70
71
/*
72
* Mask a Sequence page before performing consistency checks on it.
73
*/
74
void
75
seq_mask
(
char
*page,
BlockNumber
blkno)
76
{
77
mask_page_lsn_and_checksum
(page);
78
79
mask_unused_space
(page);
80
}
BlockNumber
uint32 BlockNumber
Definition:
block.h:31
Buffer
int Buffer
Definition:
buf.h:23
mask_page_lsn_and_checksum
void mask_page_lsn_and_checksum(Page page)
Definition:
bufmask.c:31
mask_unused_space
void mask_unused_space(Page page)
Definition:
bufmask.c:71
bufmask.h
UnlockReleaseBuffer
void UnlockReleaseBuffer(Buffer buffer)
Definition:
bufmgr.c:5383
MarkBufferDirty
void MarkBufferDirty(Buffer buffer)
Definition:
bufmgr.c:2943
bufmgr.h
BufferGetPage
static Page BufferGetPage(Buffer buffer)
Definition:
bufmgr.h:433
BufferGetPageSize
static Size BufferGetPageSize(Buffer buffer)
Definition:
bufmgr.h:422
PageInit
void PageInit(Page page, Size pageSize, Size specialSize)
Definition:
bufpage.c:42
PageGetSpecialPointer
#define PageGetSpecialPointer(page)
Definition:
bufpage.h:338
PageSetLSN
static void PageSetLSN(Page page, XLogRecPtr lsn)
Definition:
bufpage.h:390
Page
PageData * Page
Definition:
bufpage.h:81
PageAddItem
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
Definition:
bufpage.h:471
uint8
uint8_t uint8
Definition:
c.h:541
Size
size_t Size
Definition:
c.h:615
PANIC
#define PANIC
Definition:
elog.h:42
elog
#define elog(elevel,...)
Definition:
elog.h:226
pfree
void pfree(void *pointer)
Definition:
mcxt.c:1594
palloc
void * palloc(Size size)
Definition:
mcxt.c:1365
InvalidOffsetNumber
#define InvalidOffsetNumber
Definition:
off.h:26
FirstOffsetNumber
#define FirstOffsetNumber
Definition:
off.h:27
postgres.h
seq_mask
void seq_mask(char *page, BlockNumber blkno)
Definition:
sequence_xlog.c:75
seq_redo
void seq_redo(XLogReaderState *record)
Definition:
sequence_xlog.c:23
sequence_xlog.h
SEQ_MAGIC
#define SEQ_MAGIC
Definition:
sequence_xlog.h:26
xl_seq_rec
struct xl_seq_rec xl_seq_rec
XLOG_SEQ_LOG
#define XLOG_SEQ_LOG
Definition:
sequence_xlog.h:21
XLogReaderState
Definition:
xlogreader.h:175
XLogReaderState::EndRecPtr
XLogRecPtr EndRecPtr
Definition:
xlogreader.h:206
sequence_magic
Definition:
sequence_xlog.h:29
sequence_magic::magic
uint32 magic
Definition:
sequence_xlog.h:30
xl_seq_rec
Definition:
sequence_xlog.h:35
XLogRecPtr
uint64 XLogRecPtr
Definition:
xlogdefs.h:21
XLogRecGetDataLen
#define XLogRecGetDataLen(decoder)
Definition:
xlogreader.h:415
XLogRecGetInfo
#define XLogRecGetInfo(decoder)
Definition:
xlogreader.h:409
XLogRecGetData
#define XLogRecGetData(decoder)
Definition:
xlogreader.h:414
XLogInitBufferForRedo
Buffer XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id)
Definition:
xlogutils.c:315
xlogutils.h
src
backend
commands
sequence_xlog.c
Generated on Mon Dec 1 2025 18:13:11 for PostgreSQL Source Code by
1.9.4