27#ifdef MULTIXACT_INTERNAL_H
28#error multixact_internal.h should not be included in multixact_read_v18.c
30#define MultiXactOffset should_not_be_used
33#define MULTIXACT_OFFSETS_PER_PAGE (BLCKSZ / sizeof(MultiXactOffset32))
60#define MXACT_MEMBER_BITS_PER_XACT 8
61#define MXACT_MEMBER_FLAGS_PER_BYTE 1
62#define MXACT_MEMBER_XACT_BITMASK ((1 << MXACT_MEMBER_BITS_PER_XACT) - 1)
65#define MULTIXACT_FLAGBYTES_PER_GROUP 4
66#define MULTIXACT_MEMBERS_PER_MEMBERGROUP \
67 (MULTIXACT_FLAGBYTES_PER_GROUP * MXACT_MEMBER_FLAGS_PER_BYTE)
69#define MULTIXACT_MEMBERGROUP_SIZE \
70 (sizeof(TransactionId) * MULTIXACT_MEMBERS_PER_MEMBERGROUP + MULTIXACT_FLAGBYTES_PER_GROUP)
71#define MULTIXACT_MEMBERGROUPS_PER_PAGE (BLCKSZ / MULTIXACT_MEMBERGROUP_SIZE)
72#define MULTIXACT_MEMBERS_PER_PAGE \
73 (MULTIXACT_MEMBERGROUPS_PER_PAGE * MULTIXACT_MEMBERS_PER_MEMBERGROUP)
125 state->nextMXact = nextMulti;
126 state->nextOffset = nextOffset;
128 pg_sprintf(dir,
"%s/pg_multixact/offsets", pgdata);
131 pg_sprintf(dir,
"%s/pg_multixact/members", pgdata);
175 nextMXact =
state->nextMXact;
176 nextOffset =
state->nextOffset;
222 tmpMXact = multi + 1;
224 if (nextMXact == tmpMXact)
227 nextMXOffset = nextOffset;
235 prev_pageno = pageno;
240 if (pageno != prev_pageno)
245 nextMXOffset = *offptr;
248 if (nextMXOffset == 0)
253 length = nextMXOffset - offset;
257 for (
int i = 0;
i < length;
i++, offset++)
269 if (pageno != prev_pageno)
272 prev_pageno = pageno;
312 pg_fatal(
"multixact %u has more than one updating member",
315 result_xid = *xactptr;
316 result_status = status;
320 result_xid = *xactptr;
321 result_status = status;
325 member->
xid = result_xid;
326 member->
status = result_status;
TransactionId MultiXactId
void * pg_malloc(size_t size)
void pfree(void *pointer)
#define ISUPDATE_from_mxstatus(status)
#define MXACT_MEMBER_BITS_PER_XACT
static int MXOffsetToFlagsBitShift(MultiXactOffset32 offset)
#define MXACT_MEMBER_XACT_BITMASK
#define MULTIXACT_FLAGBYTES_PER_GROUP
static int64 MXOffsetToMemberPage(MultiXactOffset32 offset)
#define MULTIXACT_OFFSETS_PER_PAGE
bool GetOldMultiXactIdSingleMember(OldMultiXactReader *state, MultiXactId multi, MultiXactMember *member)
static int MXOffsetToMemberOffset(MultiXactOffset32 offset)
static int MultiXactIdToOffsetEntry(MultiXactId multi)
#define MULTIXACT_MEMBERGROUPS_PER_PAGE
static int64 MultiXactIdToOffsetPage(MultiXactId multi)
OldMultiXactReader * AllocOldMultiXactRead(char *pgdata, MultiXactId nextMulti, MultiXactOffset32 nextOffset)
#define MULTIXACT_MEMBERGROUP_SIZE
#define MULTIXACT_MEMBERS_PER_MEMBERGROUP
#define MULTIXACT_MEMBERS_PER_PAGE
void FreeOldMultiXactReader(OldMultiXactReader *state)
static int MXOffsetToFlagsOffset(MultiXactOffset32 offset)
static char buf[DEFAULT_XLOG_SEG_SIZE]
int int int int pg_sprintf(char *str, const char *fmt,...) pg_attribute_printf(2
SlruSegState * AllocSlruRead(const char *dir, bool long_segment_names)
void FreeSlruRead(SlruSegState *state)
static char * SlruReadSwitchPage(SlruSegState *state, uint64 pageno)
#define InvalidTransactionId
#define TransactionIdIsValid(xid)