Skip to content

Commit 687bc38

Browse files
author
Alexander Korotkov
committed
Yet another fix for limits.
1 parent a2180b7 commit 687bc38

File tree

3 files changed

+15
-13
lines changed

3 files changed

+15
-13
lines changed

src/backend/access/transam/multixact.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2290,7 +2290,7 @@ find_multixact_start(MultiXactId multi, MultiXactOffset *result)
22902290
* exist. Return false if unable to determine.
22912291
*/
22922292
static bool
2293-
ReadMultiXactCounts(uint32 *multixacts, MultiXactOffset *members)
2293+
ReadMultiXactCounts(uint64 *multixacts, MultiXactOffset *members)
22942294
{
22952295
MultiXactOffset nextOffset;
22962296
MultiXactOffset oldestOffset;
@@ -2345,12 +2345,12 @@ ReadMultiXactCounts(uint32 *multixacts, MultiXactOffset *members)
23452345
* It's possible that these thresholds should be user-tunable, but for now
23462346
* we keep it simple.
23472347
*/
2348-
int
2348+
int64
23492349
MultiXactMemberFreezeThreshold(void)
23502350
{
23512351
MultiXactOffset members;
2352-
uint32 multixacts;
2353-
uint32 victim_multixacts;
2352+
uint64 multixacts;
2353+
uint64 victim_multixacts;
23542354
double fraction;
23552355

23562356
/* If we can't determine member space utilization, assume the worst. */

src/backend/postmaster/autovacuum.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,7 @@ do_start_worker(void)
10831083
ListCell *cell;
10841084
TransactionId xidForceLimit;
10851085
MultiXactId multiForceLimit;
1086+
int64 multiMembersThreshold;
10861087
bool for_xid_wrap;
10871088
bool for_multi_wrap;
10881089
avw_dbase *avdb;
@@ -1122,17 +1123,18 @@ do_start_worker(void)
11221123
* particular tables, but not loosened.)
11231124
*/
11241125
recentXid = ReadNewTransactionId();
1125-
xidForceLimit = recentXid - autovacuum_freeze_max_age;
1126-
/* ensure it's a "normal" XID, else TransactionIdPrecedes misbehaves */
1127-
/* this can cause the limit to go backwards by 3, but that's OK */
1128-
if (xidForceLimit < FirstNormalTransactionId)
1129-
xidForceLimit -= FirstNormalTransactionId;
1126+
if (recentXid > FirstNormalTransactionId + autovacuum_freeze_max_age)
1127+
xidForceLimit = recentXid - autovacuum_freeze_max_age;
1128+
else
1129+
xidForceLimit = FirstNormalTransactionId;
11301130

11311131
/* Also determine the oldest datminmxid we will consider. */
11321132
recentMulti = ReadNextMultiXactId();
1133-
multiForceLimit = recentMulti - MultiXactMemberFreezeThreshold();
1134-
if (multiForceLimit < FirstMultiXactId)
1135-
multiForceLimit -= FirstMultiXactId;
1133+
multiMembersThreshold = MultiXactMemberFreezeThreshold();
1134+
if (recentMulti > FirstMultiXactId + multiMembersThreshold)
1135+
multiForceLimit = recentMulti - multiMembersThreshold;
1136+
else
1137+
multiForceLimit = FirstMultiXactId;
11361138

11371139
/*
11381140
* Choose a database to connect to. We pick the database that was least

src/include/access/multixact.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ extern void MultiXactSetNextMXact(MultiXactId nextMulti,
138138
extern void MultiXactAdvanceNextMXact(MultiXactId minMulti,
139139
MultiXactOffset minMultiOffset);
140140
extern void MultiXactAdvanceOldest(MultiXactId oldestMulti, Oid oldestMultiDB);
141-
extern int MultiXactMemberFreezeThreshold(void);
141+
extern int64 MultiXactMemberFreezeThreshold(void);
142142

143143
extern void multixact_twophase_recover(TransactionId xid, uint16 info,
144144
void *recdata, uint32 len);

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