@@ -297,10 +297,12 @@ static void do_autovacuum(void);
297
297
static void FreeWorkerInfo (int code , Datum arg );
298
298
299
299
static autovac_table * table_recheck_autovac (Oid relid , HTAB * table_toast_map ,
300
- TupleDesc pg_class_desc );
300
+ TupleDesc pg_class_desc ,
301
+ int effective_multixact_freeze_max_age );
301
302
static void relation_needs_vacanalyze (Oid relid , AutoVacOpts * relopts ,
302
303
Form_pg_class classForm ,
303
304
PgStat_StatTabEntry * tabentry ,
305
+ int effective_multixact_freeze_max_age ,
304
306
bool * dovacuum , bool * doanalyze , bool * wraparound );
305
307
306
308
static void autovacuum_do_vac_analyze (autovac_table * tab ,
@@ -1118,7 +1120,7 @@ do_start_worker(void)
1118
1120
1119
1121
/* Also determine the oldest datminmxid we will consider. */
1120
1122
recentMulti = ReadNextMultiXactId ();
1121
- multiForceLimit = recentMulti - autovacuum_multixact_freeze_max_age ;
1123
+ multiForceLimit = recentMulti - MultiXactMemberFreezeThreshold () ;
1122
1124
if (multiForceLimit < FirstMultiXactId )
1123
1125
multiForceLimit -= FirstMultiXactId ;
1124
1126
@@ -1881,6 +1883,7 @@ do_autovacuum(void)
1881
1883
BufferAccessStrategy bstrategy ;
1882
1884
ScanKeyData key ;
1883
1885
TupleDesc pg_class_desc ;
1886
+ int effective_multixact_freeze_max_age ;
1884
1887
1885
1888
/*
1886
1889
* StartTransactionCommand and CommitTransactionCommand will automatically
@@ -1910,6 +1913,13 @@ do_autovacuum(void)
1910
1913
*/
1911
1914
pgstat_vacuum_stat ();
1912
1915
1916
+ /*
1917
+ * Compute the multixact age for which freezing is urgent. This is
1918
+ * normally autovacuum_multixact_freeze_max_age, but may be less if we
1919
+ * are short of multixact member space.
1920
+ */
1921
+ effective_multixact_freeze_max_age = MultiXactMemberFreezeThreshold ();
1922
+
1913
1923
/*
1914
1924
* Find the pg_database entry and select the default freeze ages. We use
1915
1925
* zero in template and nonconnectable databases, else the system-wide
@@ -2001,6 +2011,7 @@ do_autovacuum(void)
2001
2011
2002
2012
/* Check if it needs vacuum or analyze */
2003
2013
relation_needs_vacanalyze (relid , relopts , classForm , tabentry ,
2014
+ effective_multixact_freeze_max_age ,
2004
2015
& dovacuum , & doanalyze , & wraparound );
2005
2016
2006
2017
/*
@@ -2129,6 +2140,7 @@ do_autovacuum(void)
2129
2140
shared , dbentry );
2130
2141
2131
2142
relation_needs_vacanalyze (relid , relopts , classForm , tabentry ,
2143
+ effective_multixact_freeze_max_age ,
2132
2144
& dovacuum , & doanalyze , & wraparound );
2133
2145
2134
2146
/* ignore analyze for toast tables */
@@ -2235,7 +2247,8 @@ do_autovacuum(void)
2235
2247
* the race condition is not closed but it is very small.
2236
2248
*/
2237
2249
MemoryContextSwitchTo (AutovacMemCxt );
2238
- tab = table_recheck_autovac (relid , table_toast_map , pg_class_desc );
2250
+ tab = table_recheck_autovac (relid , table_toast_map , pg_class_desc ,
2251
+ effective_multixact_freeze_max_age );
2239
2252
if (tab == NULL )
2240
2253
{
2241
2254
/* someone else vacuumed the table, or it went away */
@@ -2442,7 +2455,8 @@ get_pgstat_tabentry_relid(Oid relid, bool isshared, PgStat_StatDBEntry *shared,
2442
2455
*/
2443
2456
static autovac_table *
2444
2457
table_recheck_autovac (Oid relid , HTAB * table_toast_map ,
2445
- TupleDesc pg_class_desc )
2458
+ TupleDesc pg_class_desc ,
2459
+ int effective_multixact_freeze_max_age )
2446
2460
{
2447
2461
Form_pg_class classForm ;
2448
2462
HeapTuple classTup ;
@@ -2488,6 +2502,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
2488
2502
shared , dbentry );
2489
2503
2490
2504
relation_needs_vacanalyze (relid , avopts , classForm , tabentry ,
2505
+ effective_multixact_freeze_max_age ,
2491
2506
& dovacuum , & doanalyze , & wraparound );
2492
2507
2493
2508
/* ignore ANALYZE for toast tables */
@@ -2624,6 +2639,7 @@ relation_needs_vacanalyze(Oid relid,
2624
2639
AutoVacOpts * relopts ,
2625
2640
Form_pg_class classForm ,
2626
2641
PgStat_StatTabEntry * tabentry ,
2642
+ int effective_multixact_freeze_max_age ,
2627
2643
/* output params below */
2628
2644
bool * dovacuum ,
2629
2645
bool * doanalyze ,
@@ -2684,8 +2700,8 @@ relation_needs_vacanalyze(Oid relid,
2684
2700
: autovacuum_freeze_max_age ;
2685
2701
2686
2702
multixact_freeze_max_age = (relopts && relopts -> multixact_freeze_max_age >= 0 )
2687
- ? Min (relopts -> multixact_freeze_max_age , autovacuum_multixact_freeze_max_age )
2688
- : autovacuum_multixact_freeze_max_age ;
2703
+ ? Min (relopts -> multixact_freeze_max_age , effective_multixact_freeze_max_age )
2704
+ : effective_multixact_freeze_max_age ;
2689
2705
2690
2706
av_enabled = (relopts ? relopts -> enabled : true);
2691
2707
0 commit comments