Skip to content

Commit cb3777b

Browse files
author
Alexander Korotkov
committed
Fix multixact groups.
1 parent 917c1c4 commit cb3777b

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

src/backend/access/transam/multixact.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@
118118
* The situation for members is a bit more complex: we store one byte of
119119
* additional flag bits for each TransactionId. To do this without getting
120120
* into alignment issues, we store eight bytes of flags, and then the
121-
* corresponding 8 Xids. Each such 9-word (20-byte) set we call a "group", and
122-
* are stored as a whole in pages. Thus, with 8kB BLCKSZ, we keep 409 groups
123-
* per page. This wastes 12 bytes per page, but that's OK -- simplicity (and
121+
* corresponding 8 Xids. Each such 9-word (72-byte) set we call a "group", and
122+
* are stored as a whole in pages. Thus, with 8kB BLCKSZ, we keep 113 groups
123+
* per page. This wastes 56 bytes per page, but that's OK -- simplicity (and
124124
* performance) trumps space efficiency here.
125125
*
126126
* Note that the "offset" macros work with byte offset, not array indexes, so
@@ -878,8 +878,8 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset,
878878
for (i = 0; i < nmembers; i++, offset++)
879879
{
880880
TransactionId *memberptr;
881-
uint32 *flagsptr;
882-
uint32 flagsval;
881+
uint64 *flagsptr;
882+
uint64 flagsval;
883883
int bshift;
884884
int flagsoff;
885885
int memberoff;
@@ -903,12 +903,12 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset,
903903

904904
*memberptr = members[i].xid;
905905

906-
flagsptr = (uint32 *)
906+
flagsptr = (uint64 *)
907907
(MultiXactMemberCtl->shared->page_buffer[slotno] + flagsoff);
908908

909909
flagsval = *flagsptr;
910-
flagsval &= ~(((1 << MXACT_MEMBER_BITS_PER_XACT) - 1) << bshift);
911-
flagsval |= (members[i].status << bshift);
910+
flagsval &= ~((uint64)((1 << MXACT_MEMBER_BITS_PER_XACT) - 1) << bshift);
911+
flagsval |= ((uint64)members[i].status << bshift);
912912
*flagsptr = flagsval;
913913

914914
MultiXactMemberCtl->shared->page_dirty[slotno] = true;
@@ -1388,7 +1388,7 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members,
13881388
for (i = 0; i < length; i++, offset++)
13891389
{
13901390
TransactionId *xactptr;
1391-
uint32 *flagsptr;
1391+
uint64 *flagsptr;
13921392
int flagsoff;
13931393
int bshift;
13941394
int memberoff;
@@ -1414,7 +1414,7 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members,
14141414

14151415
flagsoff = MXOffsetToFlagsOffset(offset);
14161416
bshift = MXOffsetToFlagsBitShift(offset);
1417-
flagsptr = (uint32 *) (MultiXactMemberCtl->shared->page_buffer[slotno] + flagsoff);
1417+
flagsptr = (uint64 *) (MultiXactMemberCtl->shared->page_buffer[slotno] + flagsoff);
14181418

14191419
ptr[truelength].xid = *xactptr;
14201420
ptr[truelength].status = (*flagsptr >> bshift) & MXACT_MEMBER_XACT_BITMASK;

0 commit comments

Comments
 (0)