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
"
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:5518
MarkBufferDirty
void MarkBufferDirty(Buffer buffer)
Definition
bufmgr.c:3056
bufmgr.h
BufferGetPage
static Page BufferGetPage(Buffer buffer)
Definition
bufmgr.h:466
BufferGetPageSize
static Size BufferGetPageSize(Buffer buffer)
Definition
bufmgr.h:455
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:544
Size
size_t Size
Definition
c.h:619
PANIC
#define PANIC
Definition
elog.h:42
elog
#define elog(elevel,...)
Definition
elog.h:226
pfree
void pfree(void *pointer)
Definition
mcxt.c:1616
palloc
void * palloc(Size size)
Definition
mcxt.c:1387
InvalidOffsetNumber
#define InvalidOffsetNumber
Definition
off.h:26
FirstOffsetNumber
#define FirstOffsetNumber
Definition
off.h:27
postgres.h
fb
static int fb(int x)
Definition
preproc-init.c:92
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
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 Tue Jan 27 2026 06:13:11 for PostgreSQL Source Code by
1.9.8