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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy