agora inbox for [email protected]help / color / mirror / Atom feed
[PATCH v1 4/4] combine relopts correctly for VACUUM commands 790+ messages / 2 participants [nested] [flat]
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v1 4/4] combine relopts correctly for VACUUM commands @ 2025-06-23 20:40 Nathan Bossart <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Nathan Bossart @ 2025-06-23 20:40 UTC (permalink / raw) --- src/backend/commands/vacuum.c | 30 +++++++++++++++++++---------- src/backend/postmaster/autovacuum.c | 2 +- src/include/commands/vacuum.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0015b9ef4b0..a74c3a9e2a2 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -124,7 +124,7 @@ static void vac_truncate_clog(TransactionId frozenXID, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti); static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy); + BufferAccessStrategy bstrategy, StdRdOptions *main_opts); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); @@ -634,7 +634,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy, NULL)) continue; } @@ -1998,7 +1998,7 @@ vac_truncate_clog(TransactionId frozenXID, */ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, - BufferAccessStrategy bstrategy) + BufferAccessStrategy bstrategy, StdRdOptions *main_opts) { LOCKMODE lmode; Relation rel; @@ -2008,6 +2008,8 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + StdRdOptions saved_opts; + StdRdOptions combined_opts; Assert(params != NULL); @@ -2165,6 +2167,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, lockrelid = rel->rd_lockInfo.lockRelId; LockRelationIdForSession(&lockrelid, lmode); + if (rel->rd_options) + { + memcpy(&saved_opts, rel->rd_options, sizeof(StdRdOptions)); + memcpy(&combined_opts, rel->rd_options, sizeof(StdRdOptions)); + + if (main_opts) + combine_relopts(&combined_opts, main_opts); + } + /* * Set index_cleanup option based on index_cleanup reloption if it wasn't * specified in VACUUM command, or when running in an autovacuum worker @@ -2176,8 +2187,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, if (rel->rd_options == NULL) vacuum_index_cleanup = STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO; else - vacuum_index_cleanup = - ((StdRdOptions *) rel->rd_options)->vacuum_index_cleanup; + vacuum_index_cleanup = combined_opts.vacuum_index_cleanup; if (vacuum_index_cleanup == STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO) params->index_cleanup = VACOPTVALUE_AUTO; @@ -2197,9 +2207,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (params->max_eager_freeze_failure_rate < 0 && rel->rd_options != NULL && - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0) + combined_opts.vacuum_max_eager_freeze_failure_rate >= 0) params->max_eager_freeze_failure_rate = - ((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate; + combined_opts.vacuum_max_eager_freeze_failure_rate; else params->max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate; @@ -2211,9 +2221,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && combined_opts.vacuum_truncate_set) { - if (opts->vacuum_truncate) + if (combined_opts.vacuum_truncate) params->truncate = VACOPTVALUE_ENABLED; else params->truncate = VACOPTVALUE_DISABLED; @@ -2314,7 +2324,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; toast_vacuum_params.toast_parent = relid; - vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); + vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy, &saved_opts); } /* diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 0d1f4e38b58..ca399b6a92e 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1873,7 +1873,7 @@ get_database_list(void) return dblist; } -static void +void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts) { AutoVacOpts *toast_avopts = &toast_opts->autovacuum; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index bc37a80dc74..928f864581b 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -24,6 +24,7 @@ #include "parser/parse_node.h" #include "storage/buf.h" #include "storage/lock.h" +#include "utils/rel.h" #include "utils/relcache.h" /* @@ -377,6 +378,7 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); extern void VacuumUpdateCosts(void); +extern void combine_relopts(StdRdOptions *toast_opts, const StdRdOptions *main_opts); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, -- 2.39.5 (Apple Git-154) --QWBYbd5Ar5k8NvSv-- ^ permalink raw reply [nested|flat] 790+ messages in thread
* [PATCH v4 1/4] Re-read subscription state after lock in AlterSubscription @ 2026-07-03 12:28 Bertrand Drouvot <[email protected]> 0 siblings, 0 replies; 790+ messages in thread From: Bertrand Drouvot @ 2026-07-03 12:28 UTC (permalink / raw) AlterSubscription() reads the subscription's catalog state via GetSubscription() before acquiring AccessExclusiveLock on the subscription object. A concurrent session that commits a DROP or ALTER between the read and the lock acquisition leaves the other session acting with stale information once it unblocks. Fix by moving the GetSubscription() call, the password_required privilege check, and the local variable assignments to after LockSharedObject(), with a re-read of the subscription tuple to ensure we operate on current catalog state. Remark: The ownership check is intentionally not re-done after the lock because AlterSubscriptionOwner() does not take AccessExclusiveLock on the subscription object: it only takes RowExclusiveLock on the pg_subscription catalog table. This means ownership can change regardless of our lock, making a re-check after lock acquisition pointless. The existing "tuple concurrently updated" error from CatalogTupleUpdate() already provides a protection if ownership changes concurrently. Author: Bertrand Drouvot <[email protected]> Reviewed-by: Dilip Kumar <[email protected]> Reviewed-by: Hayato Kuroda (Fujitsu) <[email protected]> Reviewed-by: Zhijie Hou <[email protected]> Reviewed-by: Amit Kapila <[email protected]> Discussion: https://postgr.es/m/akZUpiDa1UfmzYxL%40bdtpg --- src/backend/commands/subscriptioncmds.c | 30 +++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) 100.0% src/backend/commands/ diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 4292e7fb8f4..517d46f47f9 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -1686,6 +1686,25 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, orig_conninfo_needed = false; } + heap_freetuple(tup); + + /* Lock the subscription so nobody else can do anything with it. */ + LockSharedObject(SubscriptionRelationId, subid, 0, AccessExclusiveLock); + + /* + * Re-read the subscription tuple after acquiring the lock. A concurrent + * DROP or ALTER may have committed before we acquired the lock. + */ + tup = SearchSysCacheCopy1(SUBSCRIPTIONOID, ObjectIdGetDatum(subid)); + + if (!HeapTupleIsValid(tup)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("subscription \"%s\" does not exist", + stmt->subname))); + + form = (Form_pg_subscription) GETSTRUCT(tup); + /* * Skip ACL checks on the subscription's foreign server, if any. If * changing the server (or replacing it with a raw connection), then the @@ -1695,11 +1714,6 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, */ sub = GetSubscription(subid, false, orig_conninfo_needed, false); - retain_dead_tuples = sub->retaindeadtuples; - origin = sub->origin; - max_retention = sub->maxretention; - retention_active = sub->retentionactive; - /* * Don't allow non-superuser modification of a subscription with * password_required=false. @@ -1710,8 +1724,10 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, errmsg("password_required=false is superuser-only"), errhint("Subscriptions with the password_required option set to false may only be created or modified by the superuser."))); - /* Lock the subscription so nobody else can do anything with it. */ - LockSharedObject(SubscriptionRelationId, subid, 0, AccessExclusiveLock); + retain_dead_tuples = sub->retaindeadtuples; + origin = sub->origin; + max_retention = sub->maxretention; + retention_active = sub->retentionactive; /* Form a new tuple. */ memset(values, 0, sizeof(values)); -- 2.34.1 --b+bwjVhifbzgesmw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v4-0002-Re-read-subscription-state-after-lock-in-DropSubs.patch" ^ permalink raw reply [nested|flat] 790+ messages in thread
end of thread, other threads:[~2026-07-03 12:28 UTC | newest] Thread overview: 790+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2025-06-23 20:40 [PATCH v1 4/4] combine relopts correctly for VACUUM commands Nathan Bossart <[email protected]> 2026-07-03 12:28 [PATCH v4 1/4] Re-read subscription state after lock in AlterSubscription Bertrand Drouvot <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox