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)