init
This commit is contained in:
164
db_include/access/multixact.h
Executable file
164
db_include/access/multixact.h
Executable file
@@ -0,0 +1,164 @@
|
||||
/*
|
||||
* multixact.h
|
||||
*
|
||||
* PostgreSQL multi-transaction-log manager
|
||||
*
|
||||
* Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/access/multixact.h
|
||||
*/
|
||||
#ifndef MULTIXACT_H
|
||||
#define MULTIXACT_H
|
||||
|
||||
#include "access/xlogreader.h"
|
||||
#include "lib/stringinfo.h"
|
||||
#include "storage/sync.h"
|
||||
|
||||
|
||||
/*
|
||||
* The first two MultiXactId values are reserved to store the truncation Xid
|
||||
* and epoch of the first segment, so we start assigning multixact values from
|
||||
* 2.
|
||||
*/
|
||||
#define InvalidMultiXactId ((MultiXactId) 0)
|
||||
#define FirstMultiXactId ((MultiXactId) 1)
|
||||
#define MaxMultiXactId ((MultiXactId) 0xFFFFFFFF)
|
||||
|
||||
#define MultiXactIdIsValid(multi) ((multi) != InvalidMultiXactId)
|
||||
|
||||
#define MaxMultiXactOffset ((MultiXactOffset) 0xFFFFFFFF)
|
||||
|
||||
/* Number of SLRU buffers to use for multixact */
|
||||
#define NUM_MULTIXACTOFFSET_BUFFERS 8
|
||||
#define NUM_MULTIXACTMEMBER_BUFFERS 16
|
||||
|
||||
/*
|
||||
* Possible multixact lock modes ("status"). The first four modes are for
|
||||
* tuple locks (FOR KEY SHARE, FOR SHARE, FOR NO KEY UPDATE, FOR UPDATE); the
|
||||
* next two are used for update and delete modes.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
MultiXactStatusForKeyShare = 0x00,
|
||||
MultiXactStatusForShare = 0x01,
|
||||
MultiXactStatusForNoKeyUpdate = 0x02,
|
||||
MultiXactStatusForUpdate = 0x03,
|
||||
/* an update that doesn't touch "key" columns */
|
||||
MultiXactStatusNoKeyUpdate = 0x04,
|
||||
/* other updates, and delete */
|
||||
MultiXactStatusUpdate = 0x05
|
||||
} MultiXactStatus;
|
||||
|
||||
#define MaxMultiXactStatus MultiXactStatusUpdate
|
||||
|
||||
/* does a status value correspond to a tuple update? */
|
||||
#define ISUPDATE_from_mxstatus(status) \
|
||||
((status) > MultiXactStatusForUpdate)
|
||||
|
||||
|
||||
typedef struct MultiXactMember
|
||||
{
|
||||
TransactionId xid;
|
||||
MultiXactStatus status;
|
||||
} MultiXactMember;
|
||||
|
||||
|
||||
/* ----------------
|
||||
* multixact-related XLOG entries
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
#define XLOG_MULTIXACT_ZERO_OFF_PAGE 0x00
|
||||
#define XLOG_MULTIXACT_ZERO_MEM_PAGE 0x10
|
||||
#define XLOG_MULTIXACT_CREATE_ID 0x20
|
||||
#define XLOG_MULTIXACT_TRUNCATE_ID 0x30
|
||||
|
||||
typedef struct xl_multixact_create
|
||||
{
|
||||
MultiXactId mid; /* new MultiXact's ID */
|
||||
MultiXactOffset moff; /* its starting offset in members file */
|
||||
int32 nmembers; /* number of member XIDs */
|
||||
MultiXactMember members[FLEXIBLE_ARRAY_MEMBER];
|
||||
} xl_multixact_create;
|
||||
|
||||
#define SizeOfMultiXactCreate (offsetof(xl_multixact_create, members))
|
||||
|
||||
typedef struct xl_multixact_truncate
|
||||
{
|
||||
Oid oldestMultiDB;
|
||||
|
||||
/* to-be-truncated range of multixact offsets */
|
||||
MultiXactId startTruncOff; /* just for completeness' sake */
|
||||
MultiXactId endTruncOff;
|
||||
|
||||
/* to-be-truncated range of multixact members */
|
||||
MultiXactOffset startTruncMemb;
|
||||
MultiXactOffset endTruncMemb;
|
||||
} xl_multixact_truncate;
|
||||
|
||||
#define SizeOfMultiXactTruncate (sizeof(xl_multixact_truncate))
|
||||
|
||||
|
||||
extern MultiXactId MultiXactIdCreate(TransactionId xid1,
|
||||
MultiXactStatus status1, TransactionId xid2,
|
||||
MultiXactStatus status2);
|
||||
extern MultiXactId MultiXactIdExpand(MultiXactId multi, TransactionId xid,
|
||||
MultiXactStatus status);
|
||||
extern MultiXactId MultiXactIdCreateFromMembers(int nmembers,
|
||||
MultiXactMember *members);
|
||||
|
||||
extern MultiXactId ReadNextMultiXactId(void);
|
||||
extern void ReadMultiXactIdRange(MultiXactId *oldest, MultiXactId *next);
|
||||
extern bool MultiXactIdIsRunning(MultiXactId multi, bool isLockOnly);
|
||||
extern void MultiXactIdSetOldestMember(void);
|
||||
extern int GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **xids,
|
||||
bool allow_old, bool isLockOnly);
|
||||
extern bool MultiXactIdPrecedes(MultiXactId multi1, MultiXactId multi2);
|
||||
extern bool MultiXactIdPrecedesOrEquals(MultiXactId multi1,
|
||||
MultiXactId multi2);
|
||||
|
||||
extern int multixactoffsetssyncfiletag(const FileTag *ftag, char *path);
|
||||
extern int multixactmemberssyncfiletag(const FileTag *ftag, char *path);
|
||||
|
||||
extern void AtEOXact_MultiXact(void);
|
||||
extern void AtPrepare_MultiXact(void);
|
||||
extern void PostPrepare_MultiXact(TransactionId xid);
|
||||
|
||||
extern Size MultiXactShmemSize(void);
|
||||
extern void MultiXactShmemInit(void);
|
||||
extern void BootStrapMultiXact(void);
|
||||
extern void StartupMultiXact(void);
|
||||
extern void TrimMultiXact(void);
|
||||
extern void SetMultiXactIdLimit(MultiXactId oldest_datminmxid,
|
||||
Oid oldest_datoid,
|
||||
bool is_startup);
|
||||
extern void MultiXactGetCheckptMulti(bool is_shutdown,
|
||||
MultiXactId *nextMulti,
|
||||
MultiXactOffset *nextMultiOffset,
|
||||
MultiXactId *oldestMulti,
|
||||
Oid *oldestMultiDB);
|
||||
extern void CheckPointMultiXact(void);
|
||||
extern MultiXactId GetOldestMultiXactId(void);
|
||||
extern void TruncateMultiXact(MultiXactId oldestMulti, Oid oldestMultiDB);
|
||||
extern void MultiXactSetNextMXact(MultiXactId nextMulti,
|
||||
MultiXactOffset nextMultiOffset);
|
||||
extern void MultiXactAdvanceNextMXact(MultiXactId minMulti,
|
||||
MultiXactOffset minMultiOffset);
|
||||
extern void MultiXactAdvanceOldest(MultiXactId oldestMulti, Oid oldestMultiDB);
|
||||
extern int MultiXactMemberFreezeThreshold(void);
|
||||
|
||||
extern void multixact_twophase_recover(TransactionId xid, uint16 info,
|
||||
void *recdata, uint32 len);
|
||||
extern void multixact_twophase_postcommit(TransactionId xid, uint16 info,
|
||||
void *recdata, uint32 len);
|
||||
extern void multixact_twophase_postabort(TransactionId xid, uint16 info,
|
||||
void *recdata, uint32 len);
|
||||
|
||||
extern void multixact_redo(XLogReaderState *record);
|
||||
extern void multixact_desc(StringInfo buf, XLogReaderState *record);
|
||||
extern const char *multixact_identify(uint8 info);
|
||||
extern char *mxid_to_string(MultiXactId multi, int nmembers,
|
||||
MultiXactMember *members);
|
||||
|
||||
#endif /* MULTIXACT_H */
|
||||
Reference in New Issue
Block a user