PostgreSQL Source Code git master
multixact.h
Go to the documentation of this file.
1/*
2 * multixact.h
3 *
4 * PostgreSQL multi-transaction-log manager
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 * src/include/access/multixact.h
10 */
11#ifndef MULTIXACT_H
12#define MULTIXACT_H
13
14#include "access/transam.h"
15#include "access/xlogreader.h"
16#include "lib/stringinfo.h"
17#include "storage/sync.h"
18
19
20/*
21 * The first two MultiXactId values are reserved to store the truncation Xid
22 * and epoch of the first segment, so we start assigning multixact values from
23 * 2.
24 */
25#define InvalidMultiXactId ((MultiXactId) 0)
26#define FirstMultiXactId ((MultiXactId) 1)
27#define MaxMultiXactId ((MultiXactId) 0xFFFFFFFF)
28
29#define MultiXactIdIsValid(multi) ((multi) != InvalidMultiXactId)
30
31/*
32 * Possible multixact lock modes ("status"). The first four modes are for
33 * tuple locks (FOR KEY SHARE, FOR SHARE, FOR NO KEY UPDATE, FOR UPDATE); the
34 * next two are used for update and delete modes.
35 */
36typedef enum
37{
42 /* an update that doesn't touch "key" columns */
44 /* other updates, and delete */
47
48#define MaxMultiXactStatus MultiXactStatusUpdate
49
50/* does a status value correspond to a tuple update? */
51#define ISUPDATE_from_mxstatus(status) \
52 ((status) > MultiXactStatusForUpdate)
53
54
55typedef struct MultiXactMember
56{
60
61
62/* ----------------
63 * multixact-related XLOG entries
64 * ----------------
65 */
66
67#define XLOG_MULTIXACT_ZERO_OFF_PAGE 0x00
68#define XLOG_MULTIXACT_ZERO_MEM_PAGE 0x10
69#define XLOG_MULTIXACT_CREATE_ID 0x20
70#define XLOG_MULTIXACT_TRUNCATE_ID 0x30
71
72typedef struct xl_multixact_create
73{
74 MultiXactId mid; /* new MultiXact's ID */
75 MultiXactOffset moff; /* its starting offset in members file */
76 int32 nmembers; /* number of member XIDs */
79
80#define SizeOfMultiXactCreate (offsetof(xl_multixact_create, members))
81
83{
85
86 /* to-be-truncated range of multixact offsets */
87 MultiXactId startTruncOff; /* just for completeness' sake */
89
90 /* to-be-truncated range of multixact members */
94
95#define SizeOfMultiXactTruncate (sizeof(xl_multixact_truncate))
96
97
99 MultiXactStatus status1, TransactionId xid2,
100 MultiXactStatus status2);
102 MultiXactStatus status);
103extern MultiXactId MultiXactIdCreateFromMembers(int nmembers,
104 MultiXactMember *members);
105
107extern void ReadMultiXactIdRange(MultiXactId *oldest, MultiXactId *next);
108extern bool MultiXactIdIsRunning(MultiXactId multi, bool isLockOnly);
109extern void MultiXactIdSetOldestMember(void);
110extern int GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members,
111 bool from_pgupgrade, bool isLockOnly);
112extern void GetMultiXactInfo(uint32 *multixacts, MultiXactOffset *members,
113 MultiXactId *oldestMultiXactId,
114 MultiXactOffset *oldestOffset);
115extern bool MultiXactIdPrecedes(MultiXactId multi1, MultiXactId multi2);
117 MultiXactId multi2);
118
119extern int multixactoffsetssyncfiletag(const FileTag *ftag, char *path);
120extern int multixactmemberssyncfiletag(const FileTag *ftag, char *path);
121
122extern void AtEOXact_MultiXact(void);
123extern void AtPrepare_MultiXact(void);
125
126extern Size MultiXactShmemSize(void);
127extern void MultiXactShmemInit(void);
128extern void BootStrapMultiXact(void);
129extern void StartupMultiXact(void);
130extern void TrimMultiXact(void);
131extern void SetMultiXactIdLimit(MultiXactId oldest_datminmxid,
132 Oid oldest_datoid);
133extern void MultiXactGetCheckptMulti(bool is_shutdown,
134 MultiXactId *nextMulti,
135 MultiXactOffset *nextMultiOffset,
136 MultiXactId *oldestMulti,
137 Oid *oldestMultiDB);
138extern void CheckPointMultiXact(void);
140extern void TruncateMultiXact(MultiXactId newOldestMulti,
141 Oid newOldestMultiDB);
142extern void MultiXactSetNextMXact(MultiXactId nextMulti,
143 MultiXactOffset nextMultiOffset);
144extern void MultiXactAdvanceNextMXact(MultiXactId minMulti,
145 MultiXactOffset minMultiOffset);
146extern void MultiXactAdvanceOldest(MultiXactId oldestMulti, Oid oldestMultiDB);
147extern int MultiXactMemberFreezeThreshold(void);
148
150 void *recdata, uint32 len);
152 void *recdata, uint32 len);
154 void *recdata, uint32 len);
155
156extern void multixact_redo(XLogReaderState *record);
157extern void multixact_desc(StringInfo buf, XLogReaderState *record);
158extern const char *multixact_identify(uint8 info);
159extern char *mxid_to_string(MultiXactId multi, int nmembers,
160 MultiXactMember *members);
161extern char *mxstatus_to_string(MultiXactStatus status);
162
163#endif /* MULTIXACT_H */
static int32 next
Definition: blutils.c:224
uint8_t uint8
Definition: c.h:550
TransactionId MultiXactId
Definition: c.h:681
#define FLEXIBLE_ARRAY_MEMBER
Definition: c.h:486
uint64 MultiXactOffset
Definition: c.h:683
int32_t int32
Definition: c.h:548
uint16_t uint16
Definition: c.h:551
uint32_t uint32
Definition: c.h:552
uint32 TransactionId
Definition: c.h:671
size_t Size
Definition: c.h:624
void MultiXactShmemInit(void)
Definition: multixact.c:1721
MultiXactId MultiXactIdExpand(MultiXactId multi, TransactionId xid, MultiXactStatus status)
Definition: multixact.c:354
void ReadMultiXactIdRange(MultiXactId *oldest, MultiXactId *next)
Definition: multixact.c:639
bool MultiXactIdPrecedes(MultiXactId multi1, MultiXactId multi2)
Definition: multixact.c:2828
char * mxstatus_to_string(MultiXactStatus status)
Definition: multixact.c:1511
void multixact_redo(XLogReaderState *record)
Definition: multixact.c:2882
MultiXactStatus
Definition: multixact.h:37
@ MultiXactStatusForShare
Definition: multixact.h:39
@ MultiXactStatusForNoKeyUpdate
Definition: multixact.h:40
@ MultiXactStatusNoKeyUpdate
Definition: multixact.h:43
@ MultiXactStatusUpdate
Definition: multixact.h:45
@ MultiXactStatusForUpdate
Definition: multixact.h:41
@ MultiXactStatusForKeyShare
Definition: multixact.h:38
void multixact_twophase_postcommit(FullTransactionId fxid, uint16 info, void *recdata, uint32 len)
Definition: multixact.c:1677
int multixactoffsetssyncfiletag(const FileTag *ftag, char *path)
Definition: multixact.c:2981
void GetMultiXactInfo(uint32 *multixacts, MultiXactOffset *members, MultiXactId *oldestMultiXactId, MultiXactOffset *oldestOffset)
Definition: multixact.c:2464
void PostPrepare_MultiXact(FullTransactionId fxid)
Definition: multixact.c:1607
void MultiXactSetNextMXact(MultiXactId nextMulti, MultiXactOffset nextMultiOffset)
Definition: multixact.c:1989
void AtPrepare_MultiXact(void)
Definition: multixact.c:1593
bool MultiXactIdPrecedesOrEquals(MultiXactId multi1, MultiXactId multi2)
Definition: multixact.c:2842
void MultiXactAdvanceOldest(MultiXactId oldestMulti, Oid oldestMultiDB)
Definition: multixact.c:2188
bool MultiXactIdIsRunning(MultiXactId multi, bool isLockOnly)
Definition: multixact.c:465
void MultiXactIdSetOldestMember(void)
Definition: multixact.c:539
void multixact_desc(StringInfo buf, XLogReaderState *record)
Definition: mxactdesc.c:50
Size MultiXactShmemSize(void)
Definition: multixact.c:1704
void MultiXactGetCheckptMulti(bool is_shutdown, MultiXactId *nextMulti, MultiXactOffset *nextMultiOffset, MultiXactId *oldestMulti, Oid *oldestMultiDB)
Definition: multixact.c:1943
int multixactmemberssyncfiletag(const FileTag *ftag, char *path)
Definition: multixact.c:2990
MultiXactId GetOldestMultiXactId(void)
Definition: multixact.c:2300
void CheckPointMultiXact(void)
Definition: multixact.c:1965
MultiXactId MultiXactIdCreateFromMembers(int nmembers, MultiXactMember *members)
Definition: multixact.c:658
void TrimMultiXact(void)
Definition: multixact.c:1831
char * mxid_to_string(MultiXactId multi, int nmembers, MultiXactMember *members)
Definition: multixact.c:1534
void multixact_twophase_postabort(FullTransactionId fxid, uint16 info, void *recdata, uint32 len)
Definition: multixact.c:1692
int MultiXactMemberFreezeThreshold(void)
Definition: multixact.c:2510
void MultiXactAdvanceNextMXact(MultiXactId minMulti, MultiXactOffset minMultiOffset)
Definition: multixact.c:2161
MultiXactId ReadNextMultiXactId(void)
Definition: multixact.c:622
void BootStrapMultiXact(void)
Definition: multixact.c:1790
void multixact_twophase_recover(FullTransactionId fxid, uint16 info, void *recdata, uint32 len)
Definition: multixact.c:1656
MultiXactId MultiXactIdCreate(TransactionId xid1, MultiXactStatus status1, TransactionId xid2, MultiXactStatus status2)
Definition: multixact.c:301
void TruncateMultiXact(MultiXactId newOldestMulti, Oid newOldestMultiDB)
Definition: multixact.c:2619
struct MultiXactMember MultiXactMember
const char * multixact_identify(uint8 info)
Definition: mxactdesc.c:84
void AtEOXact_MultiXact(void)
Definition: multixact.c:1565
struct xl_multixact_truncate xl_multixact_truncate
void StartupMultiXact(void)
Definition: multixact.c:1806
struct xl_multixact_create xl_multixact_create
void SetMultiXactIdLimit(MultiXactId oldest_datminmxid, Oid oldest_datoid)
Definition: multixact.c:2011
int GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, bool from_pgupgrade, bool isLockOnly)
Definition: multixact.c:1115
const void size_t len
static char buf[DEFAULT_XLOG_SEG_SIZE]
Definition: pg_test_fsync.c:71
unsigned int Oid
Definition: postgres_ext.h:32
Definition: sync.h:51
TransactionId xid
Definition: multixact.h:57
MultiXactStatus status
Definition: multixact.h:58
MultiXactId mid
Definition: multixact.h:74
MultiXactMember members[FLEXIBLE_ARRAY_MEMBER]
Definition: multixact.h:77
MultiXactOffset moff
Definition: multixact.h:75
MultiXactId endTruncOff
Definition: multixact.h:88
MultiXactOffset startTruncMemb
Definition: multixact.h:91
MultiXactOffset endTruncMemb
Definition: multixact.h:92
MultiXactId startTruncOff
Definition: multixact.h:87