diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index 45b1859..72e7e77 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -61,6 +61,7 @@ #include "utils/pg_rusage.h" #include "utils/timestamp.h" #include "utils/tqual.h" +#include "utils/guc.h" /* @@ -167,7 +168,8 @@ static bool lazy_tid_reaped(ItemPointer itemptr, void *state); static int vac_cmp_itemptr(const void *left, const void *right); static bool heap_page_is_all_visible(Relation rel, Buffer buf, TransactionId *visibility_cutoff_xid, bool *all_frozen); - +/* GUC variables */ +bool autovacuum_truncate_wait_standby; /* * lazy_vacuum_rel() -- perform LAZY VACUUM for one heap relation @@ -280,7 +282,12 @@ lazy_vacuum_rel(Relation onerel, int options, VacuumParams *params, * Optionally truncate the relation. */ if (should_attempt_truncation(vacrelstats)) - lazy_truncate_heap(onerel, vacrelstats); + { + if (!autovacuum_truncate_wait_standby) + lazy_truncate_heap(onerel, vacrelstats); + else if (TransactionIdFollowsOrEquals(OldestXmin, ShmemVariableCache->latestCompletedXid)) + lazy_truncate_heap(onerel, vacrelstats); + } /* Report that we are now doing final cleanup */ pgstat_progress_update_param(PROGRESS_VACUUM_PHASE, diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 246fea8..52c63c8 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -1582,6 +1582,16 @@ static struct config_bool ConfigureNamesBool[] = }, { + {"autovacuum_truncate_wait_standby", PGC_SIGHUP, REPLICATION_MASTER, + gettext_noop("Make autovacuum truncate to wait till all hot_standby finish there transactions"), + NULL + }, + &autovacuum_truncate_wait_standby, + false, + NULL, NULL, NULL + }, + + { {"allow_system_table_mods", PGC_POSTMASTER, DEVELOPER_OPTIONS, gettext_noop("Allows modifications of the structure of system tables."), NULL, diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index df5d2f3..5bdc045 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -531,6 +531,8 @@ #autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for # autovacuum, -1 means use # vacuum_cost_limit +#autovacuum_truncate_wait_standby = off # Make autovacuum truncate to wait till all + # hot_standby finish there transactions #------------------------------------------------------------------------------ diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index a903511..87d4d86 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -190,6 +190,8 @@ extern void vacuum_delay_point(void); /* in commands/vacuumlazy.c */ extern void lazy_vacuum_rel(Relation onerel, int options, VacuumParams *params, BufferAccessStrategy bstrategy); + /* user-settable parameters */ +extern bool autovacuum_truncate_wait_standby; /* in commands/analyze.c */ extern void analyze_rel(Oid relid, RangeVar *relation, int options,